在ubuntu上编译Pyinstaller并在SuSe 12 SP4上运行的子进程的奇怪行为

2024-06-07 06:44:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我注意到在Ubuntu16上使用pyinstaller编译的子进程有一些奇怪的行为,它在Ubuntu16上运行良好,但在Suse12SP4上失败。 想知道是否有人能告诉我我遗漏了什么琐碎的信息

基本上,我有一个简单的脚本:

import os, sys, subprocess
def get_all_outputs(cmd):
    proc = subprocess.Popen(cmd,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE,
                            shell=True,
                            universal_newlines=True)
    std_out, std_err = proc.communicate()
    return proc.returncode, std_out, std_err
cmd = raw_input('CMD:')
print get_all_outputs(cmd)

这与Ubuntu 16上的普通python文件或pyinstaller文件一样工作正常

root@ubuntu16:~/cert/dist# ./retcode
CMD:openssl x509 -in /root/cert_new/mycert.cer


(0, '-----BEGIN CERTIFICATE-----\nMIIFmTCCBIGgAwIBAgITQwAAAGqQd2QfUVAHwQABAAAAajANBgkqhkiG9w0BAQsF\nADBGMRUwEwYKCZImiZPyLGQBGRYFbG9jYWwxFjAUBgoJkiaJk/IsZAEZFgZhdmFt\nYXIxFTATBgNVBAMTDGF2YW1hci1EQy1DQTAeFw0yMDEyMjkxMjAyNDhaFw0yMjEy\nMjkxMjAyNDhaMHYxCzAJBgNVBAYTAkFVMQwwCgYDVQQIEwNOU1cxDzANBgNVBAcT\nBlN5ZG5leTERMA8GA1UEChMIRGVsbCBFTUMxEDAOBgNVBAsTB1N1cHBvcnQxIzAh\nBgNVBAMTGm5lbzEtc3lWwMBMA0GCSqGSIb3DQEBCwUAA4IBAQBjH2ubfVxCC42LVURTZUog/vJZ\nctAEBDUW3VaeRCMWD3dvB0loc0llGaXQVafh0Q2cW8Uy0qMexPcUUwp8OjbtwcBo\n3TkEApBABgX/JC9P+BXCK3NiYze1SAjsgcdeZaS0t3HLlgwc8vZSotXco+mwZM9S\nTtrU1RqU4kkqhR5+wjPT8ffLFyZNBCdDKUOF3wxsr/0uUpfm9Bnt3DahoN4dwHvI\nOvi1DSV6ob84VXKT3ehMqt27ZW5dtLQdpzINADHDHlitTAUAO+CdO3LltqobQbf8\niK8fmnmSWHVF8vA3mmIfANLILZ6XKASgo2D2RU0jPjbkWi3nPY+2aRPGS1wJ\n-----END CERTIFICATE-----\n', '')

但是,当我将编译后的文件scp到SuSe12SP4时,我从未得到输出,相反,它不断抛出错误代码127以及一条有趣的消息,如下所示:

neo_suse12sp4:~/pp # ./retcode
CMD:/usr/local/ssl/bin/openssl x509 -in /root/pp/mycert.cer

(127, '', '/bin/sh: /tmp/_MEIOqKDWs/libreadline.so.6: no version information available (required by /bin/sh)\n/usr/local/ssl/bin/openssl: relocation error: /usr/local/ssl/bin/openssl: symbol i2d_DHxparams, version OPENSSL_1.0.0 not defined in file libcrypto.so.1.0.0 with link time reference\n')

我甚至尝试使用openssl和证书的完整路径,但它根本不起作用

neo_suse12sp4:~/pp # which openssl
/usr/local/ssl/bin/openssl

如果有人能在这里帮助我,我将不胜感激。我真的很感谢你。谷歌和现有的文章似乎都无法解决这个问题


Tags: 文件incmdsslbinusrlocalroot
1条回答
网友
1楼 · 发布于 2024-06-07 06:44:05

好吧,看来我自己找到了出路。这看起来像是在SuSe 12 SP4系统上找到的openssl可执行文件与从Ubuntu 16构建系统收集的libcrypto.so库不兼容(现在正在冻结的应用程序及其子进程中覆盖system one)

我们需要修改子流程的LD_LIBRARY_路径,使系统的库优先于绑定的库

万分感谢github上的@Rok Mandeljc(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变量添加到subprocess Popen命令中

def run_command(cmd): #returns the output of a program
    proc = subprocess.Popen(cmd,stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=True, universal_newlines=True, env=env)
    std_out, std_err = proc.communicate()
    return std_out

更多信息:https://pyinstaller.readthedocs.io/en/stable/runtime-information.html?ld-library-path-libpath-considerations#ld-library-path-libpath-considerations

相关问题 更多 >