如何以编程方式从Python模块执行文件__main __(python -m path.to.file)?

时间:2016-03-10 19:15:58

标签: python python-module

我有几个Python脚本(由于导入)必须使用python' -m选项调用。

我想为他们制作快捷脚本,这就像代理一样。

例如,当用户运行命令

./train.py arg1 arg2 ...

脚本应该与

完全相同
python -m some.path.train arg1 arg2 ...

会做的。

2 个答案:

答案 0 :(得分:0)

-m开关使用了一些黑客(如setting sys.argv[0] to -c);不要试图效仿。

相反,让你的脚本和你的__main__.py使用相同的功能;不要将功能全部放在__main__.py

所以在__main__.py中,请执行:

import sys
from some.path.train import main

main(*sys.argv[1:])

并在您的train.py脚本中执行完全相同的操作:

import sys
from some.path.train import main

main(*sys.argv[1:])

如果必须将代码放在__main__.py中,我仍然会将其设为一个函数,然后您可以为train.py脚本导入该函数:

from some.path.train.__main__ import main

您可以使用setuptools entry points从函数生成train控制台脚本:

setup(
    # other arguments here...
    entry_points={
        'console_scripts': [
            'train = some.path.train:main',
        ],
    }
)

或使用

'train = some.path.train.__main__:main',

如果您将该功能放在__main__.py模块中。

答案 1 :(得分:0)

我找到了一个非常简单的解决方案。

train.py中,我在下面写了一行:

from some.path import train

它没有将__name__设置为'__main__',但我从未检查过,所以在我的情况下这不是问题。