2012-07-05 64 views
0

我有一個程序,從python調用shell腳本。在shell腳本中,我像這樣添加到LD_LIBRARY_PATH中,從mdbtools指向.so。shell腳本,Python,ld_library

NEWPATH=${PWD}"/mdbtools/usr/lib/x86_64-linux-gnu" 
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NEWPATH 

我敢肯定,這部分代碼是正確的。然後,我使用.so來調用其中一個程序「mdb-export」,使用輸入中的變量。 :

mdb-export ${1} Athlete > "${2}athlete.csv" 

這是令人困惑的部分。當我從命令行調用腳本時

./buildscvs abcd.mdb 1234 

它完美地工作。 csvs按預期填充。然而,當我調用腳本從蟒蛇:

try: 
     p = Popen([cmd, filename, prepend], stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True).communicate()[0] 
     print "p", p 
    except Exception as e: 
     print str(e) 

CMD,文件名,並在前面加上如下

filename = /app/djangoFiles/meetPlanner/2011ROXBURY.mdb 
cmd = /app/djangoFiles/meetPlanner/buildcsvs.sh 
prepend = 824365891 

的CSV中走出來的空白。這似乎與運行帶有未知程序名稱的命令時發生的情況一致,如果我跑了

abcd 1234.mdb > test.csv 

有沒有人有任何想法發生了什麼?我非常感謝你可以給我的任何幫助

謝謝!

編輯

更改爲 subprocess.check_call()

後如下建議,我現在得到了以下錯誤消息:

/mdb-export: error while loading shared libraries: libmdb.so.2: cannot open shared object file: No such file or directory 
+0

爲什麼在不使用stdin和stdout的情況下將stdin和stdout重定向到管道?只需使用'subprocess.check_call()',並打印任何stdout和stderr,這將使調試變得非常容易。 –

+0

幫助 - 謝謝!現在我在加載共享庫時遇到這個'/ app/djangoFiles/meetPlanner/mdb-export:error:libmdb.so.2:無法打開共享目標文件:沒有這樣的文件或目錄。當我從終端運行它時,不會出現這種情況。有任何想法嗎? – mythander889

回答

1

您必須檢查不僅stdoutstderr也。

(stdout, stderr) = Popen([cmd, filename, prepend], stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True).communicate() 
if stderr != "": 
    print stderr 

另外你寫的那個ou集LD_LIBRARY_PATH,但是哪裏?在腳本中還是在python程序中?如果在python程序中,你必須在Popen調用中傳遞環境散列,但是你不這樣做。

,你得到

/app/djangoFiles/meetPlanner/mdb-export: error while loading shared libraries: libmdb.so.2: cannot open shared object file: No such file or directory 

的錯誤意味着正是這LD_LIBRARY_PATH設置不正確(或根本沒有設置)。

更新

好了,現在我們知道你在腳本中設置LD_LIBRARY_PATH。 不要忘記導出它。

export LD_LIBRARY_PATH 
+0

我在腳本本身設置了LD_LIBRARY_PATH – mythander889

+1

你會導出它嗎?我的意思是在腳本中?有可能在shell中變量已經導出ant,這就是腳本工作的原因,但是在python腳本中還沒有 –

+0

這很有道理。您對如何調試如何正確設置它有任何建議嗎?它起作用時,我從命令行調用它,但不是從Python程序 – mythander889