0

我有一个从 python 调用 shell 脚本的程序。在 shell 脚本中,我像这样添加到 LD_LIBRARY_PATH,指向 mdbtools 中的 .so。

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 按预期填充。但是,当我从 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 = /app/djangoFiles/meetPlanner/2011ROXBURY.mdb
cmd = /app/djangoFiles/meetPlanner/buildcsvs.sh
prepend = 824365891

csvs出来空白。这似乎与您运行具有未知程序名称的命令时发生的情况一致,例如我运行

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

你不仅要检查stdout,还要检查stderr

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

您还写了 ou set 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 回答