【问题标题】:cannot pass arguments to python script when invoke from subprocess从子进程调用时无法将参数传递给python脚本
【发布时间】:2019-08-04 20:09:54
【问题描述】:

我已经搜索过,但找不到答案。 我想从另一个 python 脚本(主脚本)调用一个 python 脚本(子脚本)。我不能将参数从父母传递给孩子? 我期待来自控制台的“子进程启动:id1-id2”。 但我得到的是“子进程启动:测试默认”。子进程使用默认参数,而不是从父脚本接收参数。

# parent
import subprocess
subprocess.call(['python', 'child.py', 'id1', 'id2'])

# script name: child.py
def child(id, id2):
    print ('subprocess launched: {}-{}'.format(str(id), id2))

if __name__ == '__main__':
    main(id='test', id2='default')

【问题讨论】:

  • 你打电话给main(..)而不是child(..)
  • 还可以,但是这些参数在sys.args
  • 抱歉没听懂你在说什么。我想要一个子进程而不是直接调用 main 。这样我的父脚本可以继续运行,而不是等待孩子完成。@WillemVanOnsem
  • 每个脚本都从sys.args 中的命令行获取参数,但您的child.py 不使用sys.argv
  • @Lisa, ...如果这就是你想要做的全部,有更便宜/更有效的方法来fork() 一个你当前解释器的副本,启动时初始化已经完成;当您使用subprocess 启动一个全新的解释器时,它会支付第二次启动成本的费用。有关示例,请参见多处理模块。当然,还有线程(尽管这是否合适取决于实现细节)。

标签: python subprocess


【解决方案1】:

您传递给 Python 进程的参数存储在 sys.argv [Python-doc] 中。这是一个参数列表,其作用类似于$@ in bash [bash-man]

请注意,argv[0] 不是第一个参数,而是您运行的 Python 脚本的名称,如文档中所指定:

argv[0] 是脚本名称(它是否为完整路径名取决于操作系统)。

其余参数为传递给脚本的参数。

因此,您可以将child.py 重写为:

# script name: child.py
from sys import argv

def child(id, id2):
    print ('subprocess launched: {}-{}'.format(str(id), id2))

if __name__ == '__main__':
    child(id=argv[1], id2=argv[2])

【讨论】:

  • ;) 我想你的意思是:从 sys import argv
猜你喜欢
  • 2016-10-25
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2020-02-07
相关资源
最近更新 更多