如何在不构建executab的情况下分发和/或打包一个python文件,并预先加载所有依赖项

2024-03-29 10:38:01 发布

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

我已经写了一个依赖paramiko工作的python脚本。将运行我的脚本的系统具有以下限制:

  1. 没有互联网连接(所以它不能即时下载依赖项)。你知道吗
  2. 卷是用“noexec”装入的(因此我不能将代码作为用类似“pyInstaller”的东西生成的二进制文件运行)
  3. 不能期望最终用户安装任何依赖项。你知道吗
  4. 安装了Vanilla python(不带paramiko)
  5. Python版本是2.7.5
  6. Pip也未安装,不能安装在机箱上

但是,我可以访问我的开发箱上的pip(如果这有任何帮助的话)。你知道吗

那么,如何部署我的脚本,以便我能够向最终用户提供所需的依赖项,即paramiko(和paramiko的子依赖项),以便用户能够开箱即用地运行脚本呢?你知道吗

我已经尝试过pyinstaller的“一个文件夹”方法,但是后来遇到了“noexec”问题。我还尝试直接将paramiko(以及paramiko的子依赖项)复制到脚本能够找到它的地方,但没有成功。你知道吗


Tags: pip文件代码版本脚本paramiko系统部署
1条回答
网友
1楼 · 发布于 2024-03-29 10:38:01

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()

相关问题 更多 >