在 ubuntu 和 运行 上使用 Pyinstaller 在 SuSE12 SP4 上创建的可执行文件会引发 libreadline 问题

Created executable using Pyinstaller on ubuntu and running on SuSE12 SP4 throws issues for libreadline

在 ubuntu 16.04 上使用 pyinstaller 创建了一个可执行文件,并试图在 SuSe 12 SP4 上 运行 它在代码的特定部分出错。 代码是这样工作的:

可执行文件已在 ubuntu 机器上成功创建并成功运行,没有发现任何问题,但是当我在 SuSe12 SP4 上使用此可执行文件时,它会启动,但当它到达 运行 所在的代码时在 bash 脚本中,它抛出以下错误:

sh: /tmp/_MEI369vhy/libreadline.so.6: no version information available (required by sh)

我真的厌倦了寻找解决方案,到目前为止已经完成了以下工作:

我终于没有建议了,可以在这里使用一些帮助。如果可以请帮忙。

环境

Python 2.7.12

Ubuntu16.04

SuSe12 SP4

Pyinstaller 3.6

P.S。如果我创建适当的构建环境

,作为原始 python 代码的代码可以在 SuSe 12 SP4 上完美运行

所以,我终于在 Rokm 的帮助下解决了这个问题。上面的警告消息没有引起任何问题,但这是由于环境变量没有传递给子进程。 为了解决这个问题,我简单地做了以下事情:

###Add the following code to your existing code 
env = dict(os.environ)  # make a copy of the environment
lp_key = 'LD_LIBRARY_PATH'  # for GNU/Linux and *BSD.
lp_orig = env.get(lp_key + '_ORIG')
if lp_orig is not None:
    env[lp_key] = lp_orig  # restore the original, unmodified value
else:
    # This happens when LD_LIBRARY_PATH was not set.
    # Remove the env var as a last resort:
    env.pop(lp_key, None)

接下来,将环境变量添加到 subprocess Popen 命令。这是完整的代码以供参考。此代码将为您提供命令的输出以及 return 代码,即命令的退出代码。此外,您不必使用任何 shelix 或任何其他东西来 运行 它,简单的 .strip() 命令将为您完成。希望大家觉得有用,喜欢。 !!

from subprocess import Popen,PIPE,STDOUT
env = dict(os.environ)  # make a copy of the environment
lp_key = 'LD_LIBRARY_PATH'  # for GNU/Linux and *BSD.
lp_orig = env.get(lp_key + '_ORIG')
if lp_orig is not None:
    env[lp_key] = lp_orig  # restore the original, unmodified value
else:
    # This happens when LD_LIBRARY_PATH was not set.
    # Remove the env var as a last resort:
    env.pop(lp_key, None)

cmd = raw_input('Enter your command:')
out = Popen(cmd.split(),stderr=STDOUT,stdout=PIPE, env=env)

t, y = out.communicate()[0],out.returncode
print('output : ' + str(t))
print ('Return Code : ' + str(y))

P.S。不幸的是,cmd.split() 在某些情况下会失败,即当参数有空格时,例如 cmd='/usr/bin/ls "/home/user/my directory"' 会因 cmd.split() 而失败.在这种情况下, cmd = shlex.split(cmd, posix=True) 会更好。但是 shlex.split() 将在捕获标准输出时失败,因此恕我直言,没有全能解决方案