簡體   English   中英

使用更改環境的命令在python中創建子進程Popen

[英]subprocess Popen in python with command that changes environment

我正在嘗試使用子流程模塊從python運行python腳本並按順序執行腳本。 我試圖在UNIX中執行此操作,但是在新外殼中啟動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))

這將打印Entering Gentoo Prefix /opt/soft/cdtng/tools/ppack_gnu/3.2-運行'bash -l'在python控制台中獲取完整的bash配置文件,然后掛起...

Popen()不會掛起: ppack_gnu可能仍在后台運行時,它會立即返回。

您看到shell提示的事實並不意味着該命令已返回:

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

$$ -當前外殼的PID)

即使在bash中,您也不能更改父外殼的環境變量(沒有gdb或類似的技巧),這就是source命令存在的原因。

stdin=PIPE建議您將命令傳遞ppack_gnu開始的ppack_gnu 也許您需要在相應的process.stdin.write(b'command\\n')之后添加process.stdin.flush() process.stdin.write(b'command\\n')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM