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

时间:2014-03-04 05:09:28

标签: 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 

等几步。每个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)

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

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

5 个答案:

答案 0 :(得分:6)

subprocess次调用(特别是Popen)接受env参数,该参数是环境变量到值的映射。你可以用它。 e.g。

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

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

答案 1 :(得分:5)

您可以使用subprocess

>>> import subprocess
>>> subprocess.call('python something.py', shell = True)

或者您可以使用os

>>> import os
>>> os.system('python something.py')

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

>>> import os
>>> os.system('say Hello')

答案 2 :(得分:4)

据我所知,你想运行一个命令,然后传递其他命令:

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

答案 3 :(得分:0)

这是help给你的...... 对于运行命令,你可以这样做:

<强> 1)

from subprocess import call
call(["ls", "-l"])

<强> 2)

import os
os.system("command")

示例:

import os
f = os.popen('date')
now = f.read()
print "Today is ", now

要启用终端,您可以导入os模块:

import os
os.system('python script.py')

或者如上所述,您可以使用import subprocess

答案 4 :(得分:-2)

p = subprocess.Popen(". /path/to/env.sh", shell = True, stdout=subprocess.PIPE).communicate()
subprocess.call("python something.py", shell = True).communicate()