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

从另一个python脚本调用面向命令行的脚本,python,command-line,command-line-arguments,Python,Command Line,Command Line Arguments,我正在使用一个用Python编写的脚本,它使用argparse模块从命令行获取它的参数。我尽量少修改这个文件,因为不同的人都在处理它 脚本名为CLscript.py,我用 python CLscript.py -option1 arg1 -flag1 -option2 arg2 但我面临的情况是,我希望将事情自动化一个更高的级别,并使用大量脚本生成的参数自动启动此脚本 我想继续使用此脚本中可用的所有现有选项和标志组织 例如,当我从topLevelScript.py运行CLscript.py时,

我正在使用一个用Python编写的脚本,它使用argparse模块从命令行获取它的参数。我尽量少修改这个文件,因为不同的人都在处理它

脚本名为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])

你喜欢这个工作吗?将大部分代码提取到一个新函数中,该函数需要与通过命令行发送的参数类似的参数。然后编写一个新函数,收集命令行参数并将其发送到第一个函数

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函数。

首先,使用而不是
子流程。call()

请注意,作为第一个参数,您将传递一个字符串数组,正如您所希望的。
其次,标准文件描述符的重定向将非常重要。请参阅。
现在您有了
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
您说过要从子进程的输出中检测它是否出错。
您不觉得
stdout
stderr
在这种情况下非常有用吗?
现在,如果你发现出了问题,你想终止孩子的生命

child.kill()
child.terminate()
child.send_signal(signal)
如果最后你确信一切顺利,但你想让孩子正常完成,你应该使用

child.wait()
甚至更好

child.communicate()
因为
通信
将正确处理大量输出


祝你好运

“创建多个python线程,就像创建子进程一样。call()”-
子进程
模块与线程无关。实际上,我不太清楚您想做什么,请您更详细地指定它或给出一个示例?“类似于传递带有选项、标志和参数的字符串列表”-subprocess.call()的第一个参数是字符串列表。我编辑了我的问题,使之成为clearer@ElmoVanKielmo请参阅我的编辑,了解我为什么不尝试使用subprocess.call()。这将是一种处理问题的巧妙方法,我喜欢这个想法,谢谢。尽管如此,在我的特殊情况下,因为这是一个合作项目,我不能修改这个文件,Elmo的回答允许我这么做。好吧,我认为Popen之前是一些低级的东西,我不应该碰它,而是使用call,但这样看起来就不那么复杂了。谢谢大家!@antoine
subprocess.call(…)
实际上是
child=subprocess.Popen(…)
的简写,没有到stdin、stdout、stderr的管道,后跟
child.wait()
child.communicate()