【问题标题】:How to pass command line arguments to a python file from a script如何将命令行参数从脚本传递给 python 文件
【发布时间】:2017-11-15 14:56:31
【问题描述】:

我有一个文件“train.py”,它需要命令行参数来运行。有些参数是必需的,有些是可选的

例如。

.\train.py --counter arg1 --opt optional_arg

现在,我想编写一个名为“script.py”的新文件,它将导入这个“train.py”并在该脚本中传递参数并在“script.py”中执行“train.py”

我需要这样做,因为我想每次为 train.py 提供不同的参数集。

我知道我们可以使用 shell 脚本来做到这一点。我很好奇如何使用 python 脚本来做到这一点。

train.py

import optparse
optparser = optparse.OptionParser()

optparser.add_option(
    "--counter", default = "",
    help = "Counter value"
)

optparser.add_option(
    "--opt", default = "",
    help = "Optinal parameter"
)

'''Do Something'''

script.py

args = {
    '--counter':''
    '--opts':''
}

lst = [ 1, 2, 3]

for counter in lst:
    '''set command line arguments here in args dictionary'''
    args['--counter'] = counter

    '''run train.py with args as input dictionary'''

【问题讨论】:

  • 虽然你要求的是可能的,但我建议不要在不同的 python 代码之间传递数据作为命令行参数。而是将一个脚本的功能包装到一个函数或类中,然后导入另一个脚本。如果您希望能够继续将文件用作脚本,可以使用if __name__ == "__main__" idiom
  • 我建议不要在不同的 python 代码之间传递数据作为命令行参数。这背后有什么原因吗?
  • 将数据作为命令行参数传递要求您将该数据编码为字符串。虽然这对于您当前的设计或数据很简单可能没问题,但它很快就会变得乏味。最终,当您可以选择直接传递数据时,将数据转换为字符串然后再转换回原始类型似乎有点毫无意义(而且效率低下)。
  • 啊,我明白了。这就说得通了。我实际上需要它作为字符串和整数。但无论如何,我会牢记这一点,以备不时之需。谢谢:)
  • 嗨。我有一个复杂的 Flask 应用程序 master.py ,我无法在 Python3 中运行。我需要使用套接字运行 Python3 程序以将数据传递给另一个 SYSTEM 以执行操作。参数似乎是这样做的唯一方法??

标签: python python-3.x


【解决方案1】:

一种方法是通过 Python 使用os 模块和命令行:

script.py

import os

# define some args
arg1 = '74.2'
optional_arg = 'disable'

os.system("python train.py --counter" + arg1 + "--opt" + optional_arg)

【讨论】:

  • 我认为它不会起作用,因为您将它传递给 os.system 的字符串。我只是怀疑它是否会用计数器值替换 arg1。如果我错了,请纠正我。谢谢你帮助顺便说一句:)
  • 他举了一个非常简短的例子。您可以使用此方法,您只需通过某种方式将变量注入字符串。有关不同的 concat 方法和相对速度,请参阅 this answer
  • @ParshuramThorat 我编辑了我的答案,以更清楚地说明参数如何成为变量
  • 啊,我的错。我应该得到那个。没关系,它有效!谢谢:)
【解决方案2】:

一种方法是将 train.py 中的动作定义为一个函数:

def train(counter, opt=None):
    '''Do Something'''

从这里,在同一个文件中,您可以检查 main 并使用命令行参数运行该函数。

if __name__ == '__main__':
    import optparse
    optparser = optparse.OptionParser()

    optparser.add_option(
        "--counter", default = "",
        help = "Counter value"
    )

    optparser.add_option(
        "--opt", default = "",
        help = "Optional parameter"
    )

    train(counter, opt)

现在您可以像导入任何其他 python 包一样导入调用和 train 函数。假设文件位于同一目录中,可能类似于:

from train import train

args = {
    '--counter':''
    '--opts':''
}

lst = [ 1, 2, 3]

for counter in lst:
    '''set command line arguments here in args dictionary'''
    kwargs['--counter'] = counter  # changed to kwargs from OP's args
                                   # for the sake of accurate nomenclature
    train(**kwargs)

请注意,使用** 解包字典仅在键值是其值与函数参数名称相同的字符串时才有效。

这种方法的一个好处是您可以独立于命令脚本运行train,也可以在没有os 中介的情况下从python 程序运行它。

【讨论】:

    【解决方案3】:

    使用https://docs.python.org/2/library/argparse.html

    argparse 模块使编写用户友好的命令行界面变得容易。该程序定义了它需要的参数,而 argparse 将弄清楚如何从 sys.argv 中解析出这些参数。 argparse 模块还会在用户给程序无效参数时自动生成帮助和使用信息并发出错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-11
      • 2018-12-04
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 2013-10-22
      • 2016-12-19
      相关资源
      最近更新 更多