使用Python打开shell环境,运行命令并退出环境

use*_*586 6 python bash shell subprocess

我正在尝试使用python自动化进程.如果我只是在终端,工作流程如下:

user:> . /path/to/env1.sh
user:> python something.py
user:> exit
user:> . /path/to/env2.sh
user:> python something2.py
user:> exit 
Run Code Online (Sandbox Code Playgroud)

等几步.每个都会env.sh生成一个新脚本,其中包含大量环境变量以及当前目录中未设置的内容.我很确定我需要使用子进程,但我不确定如何去做.理想情况下,工作流程将是:打开新shell - >运行一些命令 - >退出shell - >根据需要重复.

编辑:似乎需要一些澄清.我理解如何使用subprocess.Popen()subprocess.call()从调用Python脚本的shell中调用东西.这不是我需要的.当一个人调用env.sh它时,它会设置大量的环境变量和一些其他相关的东西,然后将你放入一个shell来运行命令.重要的是要注意在运行所需命令后env.sh直到一种类型exit才会终止.使用subprocess.call("./env.sh", shell = True)打开shell并停在那里.这就像输入命令一样,./env.sh除了发出exit命令时,其余的python脚本.所以:

subprocess.call(". /path/to/env.sh", shell = True)
subprocess.call("python something.py", shell = True)
Run Code Online (Sandbox Code Playgroud)

不做我需要做的事情,也不做:

p = subprocess.Popen(". /path/to/env.sh", shell = True)
subprocess.call("python something.py", shell = True)
p.kill()
Run Code Online (Sandbox Code Playgroud)

mgi*_*son 6

subprocesscalls(特定Popen)接受一个env参数,该参数是环境变量到值的映射.你可以用它.例如

env = {'FOO': 'Bar', 'HOME': '/path/to/home'}
process = subprocess.Popen(['python', 'something.py'], env=env)
Run Code Online (Sandbox Code Playgroud)

当然,通常,最好在*import*ing之后调用一些函数,something.py而不是生成一个全新的进程.


A.J*_*pal 5

您可以使用subprocess

>>> import subprocess
>>> subprocess.call('python something.py', shell = True)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用os

>>> import os
>>> os.system('python something.py')
Run Code Online (Sandbox Code Playgroud)

这是一个示例(打开扬声器):

>>> import os
>>> os.system('say Hello')
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 5

据我了解,您想运行一个命令,然后将其他命令传递给它:

from subprocess import Popen, PIPE

p = Popen("/path/to/env.sh", stdin=PIPE)   # set environment, start new shell
p.communicate("python something.py\nexit") # pass commands to the opened shell
Run Code Online (Sandbox Code Playgroud)