2010-05-18 93 views
3

我需要執行命令. /home/db2v95/sqllib/db2profile,然後我才能在Python 2.6中執行import ibm_db_dbi在Python中執行BASH命令 - 在相同的過程中

執行它之前,我進入Python的工作原理:

[email protected]:~$ . /home/db2v95/sqllib/db2profile 
[email protected]:~$ 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

總猜測,但它看起來像腳本實際上在環境中設置一些東西,這可能不會通過執行子進程工作。 – abyx 2010-05-18 16:16:54

+0

@abyx:但這與給定的問題無關,即使它是真的 – SilentGhost 2010-05-18 16:19:24

回答

-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?

+1

'os.popen'已棄用 – SilentGhost 2010-05-18 16:13:23

+1

噢,該死。沒有看到大紅色的警告。對於那個很抱歉。 – Felix 2010-05-18 16:23:09

+0

不僅不推薦使用 - 從來不打算這樣使用(打開管道並忽略輸出)。如果你只是想運行一個沒有和它通信的shell命令,可以使用'os.system()'或'subprocess.call()',而不是'os.popen()'。 – 2010-05-19 06:12:59

0

你需要做的:

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

這可能「起作用」(不會引發任何異常),但很可能不會達到預期的效果。由於該文件是「來源」,它可能會設置一些環境變量。這些變量只能在由Popen啓動的shell中設置,並且在Python腳本調用中不可見。 – 2010-05-18 16:22:36

+0

這導致: 回溯(最近通話最後一個): 文件 「gagnagrunnur.py」,14號線在 進口ibm_db_dbi 文件「/usr/local/lib/python2.6/dist-packages/ibm_db_dbi .py「,第26行,在 import ibm_db ImportError:libdb2.so.1:無法打開共享目標文件:沒有這樣的文件或目錄 我想強調一下,這使用命令行工作。 – 2010-05-18 16:26:15

+0

@baldur:你是否在等待進程終止? – SilentGhost 2010-05-18 16:38:34

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重新實現整個腳本。

更新一個想法:讀取腳本入蟒,管它(使用POPEN)到所述殼中,腳本編寫env命令到相同的外殼和讀取輸出後。這樣你將獲得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 
+0

啊,好點 - db2profile確實設置了shell環境變量。不幸的是我不能使用shell包裝器(由於項目的性質)調用python腳本,db2profile很長,包含一些中等複雜的函數和(你猜對了)環境變量。我將如何着手在Python中運行整個文件? – 2010-05-18 16:33:32

+0

I.e.是否可以在Python中運行一個BASH腳本,其中包含許多賦值,環境變量和函數?或者我將不得不用Python重寫整個代碼? – 2010-05-18 16:54:13

+0

我瞭解瞭如何完成它:請參閱我的文章的更新。 – 2010-05-18 17:07:19

0

不知道你是什麼工作的操作系統和您所使用的DB2版本。較新的版本(至少9.5及以上,不確定約9.0或9.1)通過將db2clp設置爲**$$**來工作。由於DB2通常是LUW,它也可能在linux/unix下運行。但是,在AIX下,我需要運行配置文件腳本來連接到正確的數據庫實例。沒有太多檢查腳本的功能。