8

我有一个 Python 脚本,然后我通过 pyinstaller2.0 运行它来生成它的二进制文件。

python pyinstaller -F /path/to/python/script

在运行二进制文件时,它默认使用 /tmp 文件夹来保存它的临时文件并运行安装程序。这在普通服务器和 VPS 上运行良好。但是,当尝试在禁用 /tmp ( /tmp noexec) 的服务器上进行安装时,安装将失败。

我的问题如下:

  • 运行二进制文件时如何启用另一个临时位置?pyinstaller 有这样的选择吗?
  • 如果我编写代码来创建一个临时位置并将其导出到 python 脚本内的 PATH ,它是否无论如何都不会尝试使用默认 /tmp 来运行 python 二进制文件?
  • 我想到的另一种方法是在 bash 中编写一个 shell 脚本,它创建一个临时位置,导出它的 PATH,然后调用 python 二进制文件并在它运行后,从 PATH 中删除 temp 的位置,然后删除 temp 文件夹 - 但是这个似乎是一种迂回的方式来完成它。有更好的解决方案吗?
4

4 回答 4

5

PyInstaller V3.3 (2017-09-21) 开始 ,您可以使用--runtime-tmpdir参数更改默认提取路径,即:

--runtime-tmpdir PATH

在 onefile-mode 中提取库和支持文件的位置。如果给出此选项,bootloader则将忽略运行时操作系统定义的任何临时文件夹位置。将_MEIxxxxxx-folder在这里创建。请仅在您知道自己在做什么的情况下使用此选项。

于 2018-11-21T18:47:16.507 回答
3

@devnull 建议的解决方案确实是对 pyinstaller 的脚本进行更改。该脚本对临时位置进行了硬编码,因此我在那里进行了更改。所以这里是遵循的步骤:

  • 在 pyinstaller 文件夹下,查找下的launch.c文件/path/to/pyinstaller/sources/common
  • 寻找一个名为int getTempPath(char *buff)
  • 在它下面,删除对的引用static const char *envname[](即,它的声明和for同一函数中的一个循环)
  • 将 to 的值更改为static const char *dirname[]您想要的值。

因此,函数如下所示:

int getTempPath(char *buff)
{
        static const char *dirname[] = {
                "/usr/local/src/temp", "/usr/local/src", "/usr/src", 0
        };
        int i;
        char *p;
        for ( i=0; dirname[i]; i++ ) {
                strcpy(buff, dirname[i]);
                if (testTempPath(buff))
                        return 1;
        }
    return 0;
}

sources使用以下命令重新编译 pyinstaller :

python ./waf configure --no-lsb build install

要运行它,首先安装python-devel包(yum install python-devel -y),否则它会抛出错误Python.h isn't found

现在,当我们通过 pyinstaller 运行 python 脚本时,将使用新的 temp local。感谢@devnull 为我指明了正确的方向。

于 2013-09-17T11:42:32.843 回答
1

@devnull 是在正确的轨道上。缺少的部分是当安装程序二进制文件在目标机器上运行时解析这些环境变量,而不是在开发机器上编译安装程序时解析。

一个两行 shell 脚本,将 TMPDIR 环境变量(或 Windows 中的 %TEMP%)更改为您可以从中运行代码的地方,然后调用您编译的二进制文件应该可以完成工作。

顺便说一句,如果您从其他人那里获得 pyinstaller 生成的二进制文件并且无权访问源代码,则此方法的优点是它也可以工作。

于 2018-01-17T16:24:49.900 回答
1

正如@Darkerlvy 在评论中指出的那样,现在有一个命令行选项--runtime-tmpdir PATH,您可以将其传递给 pyinstaller。无需修改源或设置环境变量。它是在 pyinstaller 3.3 中引入的

于 2018-10-01T01:15:08.050 回答