Как распространять и / или упаковать файл python со всеми предварительно загруженными зависимостями без создания исполняемого файла

Я написал сценарий python, работа которого зависит от paramiko. Система, которая будет запускать мой сценарий, имеет следующие ограничения:

  1. Нет подключения к Интернету (поэтому он не может загружать зависимости на лету).
  2. Тома монтируются с помощью noexec (поэтому я не могу запустить свой код как двоичный файл, созданный с помощью чего-то вроде pyInstaller)
  3. Нельзя ожидать, что конечный пользователь установит какие-либо зависимости.
  4. Установлен ванильный питон (без парамико)
  5. Версия Python - 2.7.5
  6. Пип тоже не устанавливается и не может быть установлен на бокс

Однако у меня есть доступ к pip в моем окне разработки (если это хоть как-то помогает).

Итак, как можно развернуть мой скрипт, чтобы я мог предоставить его конечному пользователю с необходимыми зависимостями, то есть paramiko (и подчиненными зависимостями paramiko), чтобы пользователь мог запустить скрипт. из коробки?

Я уже пробовал подход pyinstaller «одна папка», но потом столкнулся с проблемой noexec. Я также попытался напрямую скопировать paramiko (и подчиненные зависимости paramiko) в место, откуда мой скрипт безуспешно может его найти.


person Shuvro Bhattacharya    schedule 16.09.2019    source источник
comment
Если вы не можете использовать pip, и, что касается, я также попытался напрямую скопировать paramiko (и подчиненные зависимости paramiko) в место, откуда мой скрипт безуспешно может его найти., этот пост может быть полезен, чтобы узнать, как это можно сделать.   -  person Arne    schedule 16.09.2019
comment
Что касается пунктов 5 и 6, python поставляется в комплекте с pip для версий >2.7.9 и >3.4. Таким образом, хотя он не может получить доступ к Интернету, его можно использовать для установки локально видимых пакетов.   -  person Arne    schedule 16.09.2019


Ответы (1)


pip обычно устанавливается с установкой python. Вы можете использовать его для установки зависимостей на машине следующим образом:

    import os, sys

    def selfInstallParamiko():
        # assuming paramiko tar-ball/wheel is under the current working directory
        currentDir = os.path.abspath(os.path.dirname(__file__))

        # paramikoFileName: name of the already downloaded paramiko tar-ball, 
        # which you'll have to ship with your scripts
        paramikoPath = os.path.join(currentDir, paramikoFileName) 

        print("\nInstalling {} ...".format(paramikoPath))

        # To check for which pip to use (pip for python2, pip3 for python3)
        pipName = "pip"
        if sys.version_info[0] >= 3:
            pipName = "pip3"

        p = subprocess.Popen("{} install --user {}".format(pipName, paramikoPath).split())
        out, err= p.communicate("")

        if err or p.returncode != 0:
            print("Unable to self-install {}\n".format(paramikoFileName))
            sys.exit(1)

        # Needed, because sometimes windows command shell does not pick up changes so good
        print("\n\nPython paramiko module installed successfully.\n"
              "Please start the script again from a new command shell\n\n")
        sys.exit()

Вы можете вызвать его, когда ваш скрипт запускается и появляется ImportError:

      # Try to self install on import failure:
      try:
          import paramiko
      except ImportError:
          selfInstallParamiko()
person scorpGoku    schedule 16.09.2019
comment
См. Пункт (1), коробка не подключена к Интернету. - person Shuvro Bhattacharya; 16.09.2019
comment
Вам нужно будет отправить tar-ball paramiko вместе со своим скриптом, поэтому в приведенной выше функции используется файловая система paramikoPath. Добавлю комментарий для большей ясности - person scorpGoku; 16.09.2019
comment
Paramiko внутренне зависит от пары других сторонних модулей, это тоже позаботится об этом? Кроме того, pip не устанавливается на поле развертывания. - person Shuvro Bhattacharya; 16.09.2019
comment
Нет. Это шаблонный ответ. Вы также можете расширить его для других зависимых библиотек - person scorpGoku; 16.09.2019
comment
К сожалению, поскольку pip не установлен, это решение не сработает в этом случае. - person Shuvro Bhattacharya; 16.09.2019