在Python中执行BASH命令 - 在同一个过程中

时间:2010-05-18 15:57:44

标签: python bash db2 subprocess

我需要在Python 2.6中. /home/db2v95/sqllib/db2profile之前执行命令import ibm_db_dbi

在我输入Python之前执行它:

baldurb@gigur:~$ . /home/db2v95/sqllib/db2profile
baldurb@gigur:~$ python
Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15) 
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ibm_db_dbi
>>> 

但是使用os.system(". /home/db2v95/sqllib/db2profile")subprocess.Popen([". /home/db2v95/sqllib/db2profile"])在Python中执行它会导致错误。我做错了什么?

编辑:这是我收到的错误:

> Traceback (most recent call last):  
> File "<file>.py", line 8, in
> <module>
>     subprocess.Popen([". /home/db2v95/sqllib/db2profile"])  
> File
> "/usr/lib/python2.6/subprocess.py",
> line 621, in __init__
>     errread, errwrite)   File "/usr/lib/python2.6/subprocess.py",
> line 1126, in _execute_child
>     raise child_exception OSError: [Errno 2] No such file or directory

4 个答案:

答案 0 :(得分:10)

你正在打电话给'。' shell命令。此命令表示“在当前进程中执行此shell文件”。你不能在Python进程中执行shell文件,因为Python不是shell脚本解释器。

/home/b2v95/sqllib/db2profile可能会设置一些shell环境变量。如果您使用system()函数读取它,那么变量将仅在执行的shell中更改,并且在调用该shell(您的脚本)的过程中将不可见。

您只能在启动python脚本之前加载此文件 - 您可以创建一个shell包装器脚本,它将执行. /home/b2v95/sqllib/db2profile并执行您的python脚本。

其他方式是查看db2profile包含的内容。如果只有NAME=value行,您可以在python脚本中解析它并使用获得的数据更新os.environ。如果脚本执行更多操作(比如调用其他内容来获取值),则可以在Python中重新实现整个脚本。

更新一个想法:在将脚本写入env命令到同一个shell并读取输出后,将脚本读入python,将其(使用Popen)传递给shell。这样您就可以获得shell中定义的所有变量。现在您可以阅读变量。

这样的事情:

shell = subprocess.Popen(["sh"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
script = open("/home/db2v95/sqllib/db2profile", "r").read()
shell.stdin.write(script + "\n")
shell.stdin.write("env\n")
shell.stdin.close()
for line in shell.stdout:
    name, value = line.strip().split("=", 1)
    os.environ[name] = value

答案 1 :(得分:0)

你需要这样做:

subprocess.Popen(['.', '/home/db2v95/sqllib/db2profile'], shell=True)

答案 2 :(得分:0)

不确定您正在使用哪种操作系统以及您正在使用的DB2版本。较新的版本(至少9.5及以上,不确定9.0或9.1)通过将db2clp设置为**$$**来工作。由于DB2通常是LUW,因此它也可以在linux / unix下运行。但是,在AIX下,我需要运行配置文件脚本以连接到正确的数据库实例。没有仔细检查该脚本的功能。

答案 3 :(得分:-1)

也许os.popen正是您正在寻找的(更好的是,popen[2-4]变体之一)?例如:

import os
p = os.popen(". /home/b2v95/sqllib/db2profile")
p.close() # this will wait for the command to finish
import ibm_db_dbi

修改:我发现您的错误显示为No such file or directory。尝试不使用点运行它,如下所示:

os.popen("/home/b2v95/sqllib/db2profile")

如果这不起作用,可能与您的环境有关。也许你正在运行Python jailed / chrooted?

相关问题