我需要在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
答案 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?