Созданный исполняемый файл с использованием Pyinstaller в Ubuntu и работающий на SuSE12 SP4 вызывает проблемы с libreadline

Создал исполняемый файл с помощью pyinstaller на Ubuntu 16.04 и попытался запустить его на SuSe 12 SP4, выдает ошибку в определенной части кода. Код работает следующим образом:

  • Это фляжное приложение, которое получает ввод от пользователя через Интернет.
  • Обработайте эти входные данные и создайте сценарий .sh и запустите этот сценарий оболочки.
  • Считывает вывод из сценария оболочки и представляет его в Интернете в качестве возвращаемого рендеринга.

Исполняемый файл был успешно создан на машине с Ubuntu и успешно работает, и никаких проблем не наблюдается, но когда я использую этот исполняемый файл на SuSe12 SP4, он запускается, но когда он достигает кода, в котором он запускает сценарий bash, он выдает следующую ошибку:

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

Я действительно устал искать решения и до сих пор сделал следующее:

  • Пробовал и --onefile и --onedir, без разницы
  • Пытался создать исполняемый файл на SuSe12 sp4, но он выдает другую ошибку, связанную с тем, что подпроцесс не найден.
  • Безуспешно пытался найти libreadline.so на Suse.
  • Пытался создать env на Ubuntu 14, но слишком много ошибок зависимостей

Наконец-то у меня закончились предложения, и я мог бы здесь помочь. Если вы можете, пожалуйста, помогите.

Окружающая обстановка

Питон 2.7.12

Убунту 16.04

SuSe12 SP4

Пиинсталлятор 3.6

P.S. Код в виде необработанного кода Python безупречно работает на SuSe 12 SP4, если я создам правильную среду сборки


person PanDe    schedule 30.12.2020    source источник


Ответы (1)


Итак, я, наконец, решил это с некоторой помощью 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. Вот полный код для справки. Этот код даст вам вывод команды, а также код возврата, также известный как код выхода команды. Кроме того, вам не нужно использовать какой-либо шеликс или что-либо еще для его запуска, простая команда .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, поэтому универсального решения IMHO не существует.

person PanDe    schedule 31.12.2020