0

我有一个 Python 程序,它需要执行一个不同的进程(我用subprocess.Popen它)。我需要这个执行来表现得好像用户在 shell 命令提示符下键入了以下内容:

$ source path/to/some_file
$ ./some_program

我希望我会使用shell=True某种形式的命令链接来首先运行source然后执行程序。但是,我面临以下问题:

启动我的 Python 程序的 shell 可以是bash, sh, tcsh(或者其他类型的csh)。我需要some_file根据正在运行的 shell 来寻找不同的来源。有没有办法确定这一点?无论是在 Python 中还是通过在里面运行一些东西Popen(..., shell=True),两者都可以。

我正在考虑编写某种“shell polyglot”来从不同的 shell 中获得不同的输出,但是我的 shell 技能(尤其是在 csh 中)不能胜任这样的任务。我有什么选择?

4

2 回答 2

3

使用哪个 shellsubprocess.Popen()不是由用于启动 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 之外启动您的程序。

于 2013-03-26T13:25:08.370 回答
1

..生成外壳然后与之通信呢?

我的意思是,像这样:

proc = subprocess.Popen(['/bin/bash'], stdin=PIPE, stdout=PIPE)
proc.communicate("source path/to/some_file\n"
                 "./some_program\n")

由于您想在特定的 shell 中执行两个命令,我认为这将是您拥有的最佳解决方案。

否则,您可能会发现您的 shell 接受诸如“初始化脚本”和“初始命令”之类的参数;在这种情况下,如果你只需要使用那个特定的 shell,你应该使用它们;例如,bash 接受--init-file file并且-c command可以完成这项工作(--init-file将被加载而不是 bashrc)。

于 2013-03-26T13:23:54.767 回答