在 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 上 运行 它在代码的特定部分出错。
代码是这样工作的:
- 它是一个 flask 应用程序,可以通过网络接收用户的输入
- 处理这些输入并创建一个 .sh 脚本和 运行 该 shell 脚本
- 从 shell 脚本读取输出并将其作为 return 渲染呈现给网络
可执行文件已在 ubuntu 机器上成功创建并成功运行,没有发现任何问题,但是当我在 SuSe12 SP4 上使用此可执行文件时,它会启动,但当它到达 运行 所在的代码时在 bash 脚本中,它抛出以下错误:
sh: /tmp/_MEI369vhy/libreadline.so.6: no version information available (required by sh)
我真的厌倦了寻找解决方案,到目前为止已经完成了以下工作:
- 尝试了 --onefile 和 --onedir,没有区别
- 尝试在 SuSe12 sp4 本身上创建可执行文件,但它会引发有关未找到子进程的不同错误
- 尝试在 Suse 上找到 libreadline.so,但没有成功
- 尝试在 ubuntu 14 上创建环境,但依赖项错误太多
我终于没有建议了,可以在这里使用一些帮助。如果可以请帮忙。
环境
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() 将在捕获标准输出时失败,因此恕我直言,没有全能解决方案
在 ubuntu 16.04 上使用 pyinstaller 创建了一个可执行文件,并试图在 SuSe 12 SP4 上 运行 它在代码的特定部分出错。 代码是这样工作的:
- 它是一个 flask 应用程序,可以通过网络接收用户的输入
- 处理这些输入并创建一个 .sh 脚本和 运行 该 shell 脚本
- 从 shell 脚本读取输出并将其作为 return 渲染呈现给网络
可执行文件已在 ubuntu 机器上成功创建并成功运行,没有发现任何问题,但是当我在 SuSe12 SP4 上使用此可执行文件时,它会启动,但当它到达 运行 所在的代码时在 bash 脚本中,它抛出以下错误:
sh: /tmp/_MEI369vhy/libreadline.so.6: no version information available (required by sh)
我真的厌倦了寻找解决方案,到目前为止已经完成了以下工作:
- 尝试了 --onefile 和 --onedir,没有区别
- 尝试在 SuSe12 sp4 本身上创建可执行文件,但它会引发有关未找到子进程的不同错误
- 尝试在 Suse 上找到 libreadline.so,但没有成功
- 尝试在 ubuntu 14 上创建环境,但依赖项错误太多
我终于没有建议了,可以在这里使用一些帮助。如果可以请帮忙。
环境
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() 将在捕获标准输出时失败,因此恕我直言,没有全能解决方案