你能解释一下调用
python -m mymod1 mymod2.py args
和
python mymod1.py mymod2.py args
似乎在两种情况下都mymod1.py被称为并且sys.argv是
mymod1.py
sys.argv
['mymod1.py', 'mymod2.py', 'args']
那么这个开关是干什么-m用的呢?
-m
当然可以。-m开关用于将一个模块作为脚本运行,它改变了Python解释器定位和运行模块的方式。下面是这两种调用方式的详细解释:
mymod1
sys.path
PYTHONPATH
如果mymod1是某个包的一部分,Python会正确处理模块在包结构中的位置。
当前目录:
当前目录不会自动添加到sys.path。这意味着mymod1需要在当前PYTHONPATH中可见或是已安装的包中。
__name__和__package__:
__name__
__package__
模块mymod1的__name__属性将被设置为'__main__',但它的__package__属性会正确地设置为它所属的包(如果有的话)。这对于模块中的相对导入很有用。
'__main__'
argv:
['-m', 'mymod1', 'mymod2.py', 'args']
直接运行脚本时,Python将mymod1.py视为文件名。它会在当前目录中查找mymod1.py。
当前目录会自动添加到sys.path。这意味着Python会在当前目录中找到mymod1.py,不需要它在PYTHONPATH中。
脚本mymod1.py的__name__属性将被设置为'__main__',而它的__package__属性将是None。如果mymod1.py中使用了相对导入,这可能会导致问题,因为这些导入在直接执行脚本时不会正确工作。
None
示例场景:
考虑以下包结构:
mypackage/ __init__.py mymod1.py mymod2.py
python -m mypackage.mymod1 mymod2.py args
mypackage
python mypackage/mymod1.py mymod2.py args