python中的子进程Popen,带有改变环境的命令

时间:2015-08-03 08:17:02

标签: python unix subprocess gnu

我正在尝试使用子进程模块从python运行python脚本并按顺序执行脚本。 我试图在UNIX中执行此操作,但在我在新shell中启动python之前,我需要执行一个命令(ppack_gnu)来设置python的环境(并在控制台中打印一些行)。

问题是,当我从python子进程运行此命令时,进程挂起并等待此命令完成,而当我在UNIX控制台中执行此操作时,它会自动跳转到下一行。

以下示例:

从UNIX:

[user1@1:~]$ ppack_gnu; echo 1
You appear to be in prefix already (SHELL=/opt/soft/cdtng/tools/ppack_gnu/3.2/bin/bash)
1
[user1@1:~]$ 

来自PYTHON:

processes.append(Popen("ppack_gnu; echo 1", shell=True, stdin = subprocess.PIPE))

这将打印输入Gentoo前缀/opt/soft/cdtng/tools/ppack_gnu/3.2 - 运行'bash -l'以获取完整的bash配置文件  在python控制台中,然后挂起......

1 个答案:

答案 0 :(得分:0)

Popen()未挂起:当ppack_gnu可能仍在后台运行时,它会立即返回。

您看到shell提示符并不意味着该命令已返回:

⟫ echo $$
9302 # current shell
⟫ bash
⟫ echo $$
12131 # child shell
⟫ exit
⟫ echo $$
9302 # current shell

($$ -- PID of the current shell)

即使在bash中,也无法更改父shell的环境变量(没有gdb或类似的hacks),这就是source命令存在的原因。

stdin=PIPE表示您希望将命令传递给ppack_gnu启动的shell。您可能需要在相应的process.stdin.flush()之后添加process.stdin.write(b'command\n')