当前位置: 首页 > 面试题库 >

是否使用-m选项执行Python代码

唐烨煜
2023-03-14
问题内容

python解释器具有-m 模块 选项“将库模块 模块 作为脚本运行”。

使用此python代码a.py:

if __name__ == "__main__":
    print __package__
    print __name__

我测试python -m a

"" <-- Empty String
__main__

python a.py回报

None <-- None
__main__

对我来说,这两个调用似乎是相同的,只是当用-m选项调用__package__时不为None。

有趣的是,有了python -m runpy a,我得到了与python -m a编译成a.pyc的python模块相同的东西。

这些调用之间的(实际)区别是什么?它们之间有什么利弊?

同样,David Beazley的Python Essential Reference将其解释为“
-m选项将库模块作为脚本运行,并在执行主脚本之前在__main__模块内部执行 ”。这是什么意思?


问题答案:

当您使用-m命令行标志时,Python将为您导入模块
或包 ,然后将其作为脚本运行。当您不使用该-m标志时,您命名的文件 仅作为脚本 运行。

当您尝试运行软件包时,区别很重要。之间有很大的区别:

python foo/bar/baz.py

python -m foo.bar.baz

与后一种情况一样,foo.bar将导入,并且相对导入将foo.bar作为起点正确运行。

演示:

$ mkdir -p test/foo/bar
$ touch test/foo/__init__.py
$ touch test/foo/bar/__init__.py
$ cat << EOF > test/foo/bar/baz.py 
> if __name__ == "__main__":
>     print __package__
>     print __name__
> 
> EOF
$ PYTHONPATH=test python test/foo/bar/baz.py 
None
__main__
$ PYTHONPATH=test python -m foo.bar.baz 
foo.bar
__main__

结果,在使用-m开关时,Python实际上必须关心软件包。普通脚本永远 不能 是软件包,因此__package__将其设置为None

但运行一个封装或模块 与包裹-m和现在至少存在 可能性 的封装的,所以__package__变量设置为一个字符串值;
在上面的演示中,将其设置为'foo.bar',对于不在包内的普通模块,将其设置为空字符串。

至于__main__ 模块
,Python会导入正在运行的脚本,就像导入常规模块一样。创建一个新的模块对象来保存全局名称空间,并将其存储在中sys.modules['__main__']。这就是__name__变量所指的,它是该结构中的关键。

对于包,您可以在其中创建一个__main__.py模块,并在运行时运行该模块python -m package_name;其实这是你的唯一途径
可以 运行包的脚本:

$ PYTHONPATH=test python -m foo.bar
python: No module named foo.bar.__main__; 'foo.bar' is a package and cannot be directly executed
$ cp test/foo/bar/baz.py test/foo/bar/__main__.py
$ PYTHONPATH=test python -m foo.bar
foo.bar
__main__

因此,在命名要与一起运行的包时-m,Python会查找__main__该包中包含的模块并将其作为脚本执行。然后,其名称仍设置为'__main__',并且模块对象仍存储在中sys.modules['__main__']



 类似资料:
  • python解释器具有模块选项,该选项“将库模块作为脚本运行”。 使用此python代码a.py: 我测试了以获得 而返回 对我来说,这两个调用似乎是相同的,只是当使用-m选项调用时,包不是None。 有趣的是,使用,我得到了与相同的结果,其中python模块被编译为a.pyc。 这些调用之间的(实际)区别是什么?他们之间有什么利弊吗? 另外,David Beazley的Python Essent

  • 问题内容: 为了从Java执行python脚本(具有几个命​​令行参数),我尝试使用的是以下Java代码 例如,我打算执行以下命令: 请注意,参数arg3采用参数值列表。 我面临的问题是我没有找到将值列表传递给参数arg3的方法。 如果有人可以给我一些提示以解决我的问题,我将不胜感激。 我已经进行了搜索,但是找不到适合我需要的答案,如果有人找到正确的链接,请告诉我。 最好! 问题答案: 只需将它们

  • 我在这里学习选修课的教程-https://www.geeksforgeeks.org/java-8-optional-class/其中有以下几点 我正在尝试使用检查as减少行数 但无法进一步了解其他部分 有办法吗?

  • 问题内容: 考虑到此代码,我是否可以绝对确定该块始终执行,无论它是什么? 问题答案: 是的,将在执行或代码块后调用。 唯一不会被调用的时间是: 如果你调用 如果你调用 如果JVM首先崩溃 如果JVM在或catch块中达到了无限循环(或其他不间断,不终止的语句) 操作系统是否强行终止了JVM进程;例如,在UNIX上 如果主机系统死机;例如,电源故障,硬件错误,操作系统崩溃等 如果该块将由守护程序线程

  • 问题内容: Python 3等效于什么? 问题答案: 从文档: 该模块已合并到Python 3.0中。将源转换为3.0时,2to3工具将自动适应导入。 因此,您的命令是,或者取决于您的安装,它可以是:

  • 本文向大家介绍使用PyV8在Python爬虫中执行js代码,包括了使用PyV8在Python爬虫中执行js代码的使用技巧和注意事项,需要的朋友参考一下 前言 可能很多人会觉得这是一个奇葩的需求,爬虫去好好的爬数据不就行了,解析js干嘛?吃饱了撑的? 搜索一下互联网上关于这个问题还真不少,但是大多数童鞋是因为自己的js基础太烂,要么是HTML基础烂,要么ajax基础烂,反正各方面都很烂。基础这么渣不