代码之家  ›  专栏  ›  技术社区  ›  PanDe

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

  •  0
  • PanDe  · 技术社区  · 4 年前

    在ubuntu 16.04上使用pyinstaller创建了一个可执行文件,并试图在SuSe 12 SP4上运行它,但在代码的某个部分出现了错误。 代码的工作原理如下:

    • 这是一个通过网络接收用户输入的烧瓶应用程序
    • 处理这些输入,创建一个.sh脚本并运行该shell脚本
    • 读取shell脚本的输出,并将其作为返回渲染呈现给web

    该可执行文件已在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上创建env,但出现了太多依赖项错误

    我终于没有建议了,需要一些帮助。如果你能帮忙的话。

    环境

    Python 2.7.12

    Ubuntu 16.04

    SuSe12 SP4

    Pyinstaller 3.6

    附言:如果我创建了适当的构建环境,那么作为原始python代码的代码在SuSe 12 SP4上可以完美运行

    0 回复  |  直到 4 年前
        1
  •  0
  •   PanDe    4 年前

    所以,在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)
    

    接下来,将env变量添加到子进程Popen命令中。这是完整的代码供参考。这段代码将为您提供命令的输出,并返回命令的退出代码。此外,您不必使用任何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()在捕获stdout时会失败,因此没有更全面的解决方案