【问题标题】:How to execute a file from Python module as __main__ (python -m path.to.file) programatically?如何以编程方式将 Python 模块中的文件作为 __main__ (python -m path.to.file) 执行?
【发布时间】:2016-03-10 19:15:57
【问题描述】:

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

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

例如当用户运行命令时

./train.py arg1 arg2 ...

脚本应该和

做同样的事情
python -m some.path.train arg1 arg2 ...

会的。

【问题讨论】:

  • train.py 应该找出some.path. 吗?因为那不一定是独一无二的……
  • @mgilson 不,路径应该是硬编码的。

标签: python python-module


【解决方案1】:

-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 模块中。

【讨论】:

  • 我想知道是否可以在不修改代码的情况下模拟-m 开关,但我想你说服了我改变主意。在模块内部的 train.py 中,只有一些函数声明,然后只有一些指令(我不检查模块是否等于 __main__ 等,所以我不必模仿它)。唯一迫使我使用繁琐的python -m ... 的是从上层目录导入。 :|也许你会想出别的办法。
  • @Luke:试图完全模仿-m 开关是.. 一个傻瓜游戏,没有意义。当你运行training.py 时,你只需要确保你的模块搜索路径中有some,真的。
  • 我想在运行./some/path/train.py时我需要在模块搜索路径中有./some./some/path,因为train.py./**/*下的其他文件中导入各种东西,这些文件导入其他等等.
  • 然后是关于可用性的问题。如何设置模块搜索路径,方便用户直接调用./some/path/train.py,不费吹灰之力?
  • @Luke:不,您希望路径中有./some./some/path。您希望 . 在搜索路径中,以便 import some 找到 ./some
【解决方案2】:

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

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

from some.path import train

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

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 2016-12-03
    • 2010-10-11
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多