简体   繁体   中英

subprocess Popen in python with command that changes environment

I'm trying to run a python script from python using the subprocess module and executing a script sequentially. I'm trying to do this in UNIX but before I launch python in a new shell I need to execute a command (ppack_gnu) that sets the environment for python (and prints some lines in the console).

The thing is that when I run this command from python subprocess the process hangs and waits for this command to finish whereas when I do it in the UNIX console it jumps to the next line automatically.

Examples below:

From 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:~]$ 

From PYTHON:

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

This will print Entering Gentoo Prefix /opt/soft/cdtng/tools/ppack_gnu/3.2 - run 'bash -l' to source full bash profiles in the python console and then hang...

Popen() does not hang: it returns immediately while ppack_gnu may be still running in the background.

The fact that you see the shell prompt does not mean that the command has returned:

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

( $$ -- PID of the current shell)

Even in bash, you can't change environment variables of the parent shell (without gdb or similar hacks) that is why source command exists.

stdin=PIPE suggests that you want to pass commands to the shell started by ppack_gnu . Perhaps you need to add process.stdin.flush() after the corresponding process.stdin.write(b'command\\n') .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM