我有一个需要执行不同进程的Python程序(我使用subprocess.Popen
)。我需要执行此操作,就像用户在shell命令提示符下键入以下内容一样:
$ source path/to/some_file
$ ./some_program
我希望我会使用shell=True
和某种形式的命令链来首先运行source
,然后执行该程序。但是,我面临以下问题:
启动我的Python程序的shell可能是bash
,sh
,tcsh
(或者其他一些csh
的风格)。我需要根据运行的shell来获取不同的some_file
。有没有办法确定这个?无论是在Python中还是在Popen(..., shell=True)
内部运行,都可以。
我正在考虑编写某种“shell polyglot”来获取不同shell的不同输出,但我的shell技能(特别是在csh中)不能胜任这样的任务。我有什么选择?
答案 0 :(得分:3)
subprocess.Popen()
使用的shell不是由用于启动Python的父shell决定的。相反,默认情况下,Python使用的shell始终为/bin/sh
,如果需要,可以通过在Popen()
中明确指定可执行文件来更改它。
但实际上,任何给定的shell脚本都可以为一种特定类型的shell编写。我们说它是bash
。然后你可以通过写一个像这样的shell脚本来忽略Python方面的这些细节:
#!/usr/bin/env bash
source path/to/some_file
exec ./some_program
你去了:一个完整的启动器脚本,它在开始时切换到bash,提供必要的位,并启动你的程序。任何合理的shell都应该能够运行它,所以现在你不必担心Python调用哪个shell ...而且你有一种更可重复的方式在Python之外启动你的程序。
答案 1 :(得分:1)
..如何生成shell然后与它进行通信?
我的意思是,像这样:
proc = subprocess.Popen(['/bin/bash'], stdin=PIPE, stdout=PIPE)
proc.communicate("source path/to/some_file\n"
"./some_program\n")
由于您想在特定shell中执行两个命令,我认为这将是您拥有的最佳解决方案。
否则,您可能会发现shell接受诸如“init script”和“initial command”之类的参数;在这种情况下,如果你只需要使用那个特定的shell,你应该使用它们;例如,bash会接受--init-file file
和-c command
来完成这项工作(--init-file
将会加载而不是bashrc。)