0

Python からシェル スクリプトを呼び出すプログラムがあります。シェル スクリプトでは、mdbtools の .so を指定して、LD_LIBRARY_PATH に追加します。

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

コードのこの部分は正しいと確信しています。次に、入力の変数を使用して、.so からプログラムの 1 つを「mdb-export」と同様に呼び出します。:

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

ここが紛らわしい部分です。コマンドラインからスクリプトを呼び出すと

./buildscvs abcd.mdb 1234

それは完全に機能します。csv は期待どおりに入力されます。ただし、Python からスクリプトを呼び出すと、次のようになります。

    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、および prepend は次のとおりです。

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
4

1 に答える 1

2

だけでなく、チェックする必要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
于 2012-07-05T04:08:32.673 に答える