从另一个python脚本调用面向命令行的脚本
我正在使用一个用Python编写的脚本,它使用argparse模块从命令行获取它的参数。我尽量少修改这个文件,因为不同的人都在处理它 脚本名为CLscript.py,我用从另一个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 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,但这样看起来就不那么复杂了。谢谢大家!@antoinesubprocess.call(…)
实际上是child=subprocess.Popen(…)
的简写,没有到stdin、stdout、stderr的管道,后跟child.wait()
。
child.communicate()