从另一个python脚本调用面向命令行的脚本

时间:2014-03-24 11:37:38

标签: python command-line command-line-arguments

我使用的是用Python编写的脚本,它使用argparse模块从命令行获取它的参数。我尝试尽可能少地修改此文件,因为各种人都在使用它。

Ex:脚本名为CLscript.py,我用

调用它
python CLscript.py -option1 arg1 -flag1 -option2 arg2

但我面临的情况是,我希望自动升级一级,并使用各种脚本生成的参数自动启动此脚本。

我想继续使用此脚本中现有的所有选项和标志组织。

例如,当我从topLevelScript.py通过:

运行CLscript.py时
subprocess.call("python CLscript.py -option1 arg1 -flag1 -option2 arg2")

,我从输出中看到出现了问题,我停止执行topLevelScript.py,但CLscript.py继续在另一个我必须手动杀死的python进程中独立运行。我无法在调试模式下启动topLevelScript.py以在CLscript.py中的断点处停止。

我想从python内部完成所有操作,无需构建命令行字符串并使用子进程启动CLscript.py。 每个调用都将保持附加到同一个原始启动,就像函数调用一样,而不是像使用subprocess.call()那样创建多个python线程。

可能会以某种方式将带有选项,标志和参数的字符串列表传递给脚本吗?

是否有像

这样的东西
import CLscript.py
CLsimulator(CLscript,["-option1",arg1,"-flag1","-option2",arg2])

2 个答案:

答案 0 :(得分:1)

这样的事情会起作用吗?将大部分代码提取到一个新函数中,该函数需要与通过命令行发送的参数类似的参数。然后编写一个新函数,收集命令行参数并将它们发送到第一个函数...

def main(foo, bar):
    a = foo + bar
    print a

def from_command_line():
    foo, bar = get_command_line_args()
    main(foo, bar)

if __name__ == "__main__":
    from_command_line()

然后你的其他脚本就可以调用main函数。

答案 1 :(得分:1)

首先,使用http://docs.python.org/2/library/subprocess.html#subprocess.Popen而非subprocess.call()

import subprocess

child = subprocess.Popen(
    ['python', 'CLscript.py', '-option1', 'arg1', '-flag1', '-option2', 'arg2'],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE
)

请注意,作为第一个参数,您可以按照自己的意愿传递array of strings 其次,重定向标准文件描述符非常重要。见http://docs.python.org/2/library/subprocess.html#subprocess.PIPE
现在您有child变量,其中包含Popen类的实例 你可以用这个实例做什么?

# Check if child is terminated and possibly get the returncode
child.poll()
# Write to child's standard input by a file-like object accessible with
child.stdin
# Read child's standard output and standard error by file-like objects accesible with
child.stdout
child.stderr

你说你想要检查子进程中输出的内容是否出错 您是否认为stdoutstderr对此案非常有用? 现在你想要在发现问题出现时终止孩子。

child.kill()
child.terminate()
child.send_signal(signal)

如果你最终确定一切顺利,但你想让孩子正常完成,你应该使用

child.wait()

甚至更好

child.communicate()

因为communicate会正确处理大量输出。

祝你好运!