使用pyinstaller的备用/ tmp位置

rah*_*huL 5 python bash pyinstaller

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

python pyinstaller -F /path/to/python/script
Run Code Online (Sandbox Code Playgroud)

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

我的问题如下:

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

Ped*_*ito 5

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

--runtime-tmpdir PATH
Run Code Online (Sandbox Code Playgroud)

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

  • 我想你可以说“_它在 linux 上对 **我** 不起作用_”,因为 `--runtime-tmpdir` 是一个 [有效](https://pyinstaller.readthedocs.io/en/v3.3.1/ man/pyi-makespec.html?highlight=runtime-tmpdir#rarely-used-special-options) `PyInstaller` 的命令行参数。 (2认同)

rah*_*huL 3

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

  • 在pyinstaller文件夹下,查找launch.c下面的文件/path/to/pyinstaller/sources/common
  • 寻找一个名为的函数int getTempPath(char *buff)
  • 在其下,删除对 的引用static const char *envname[](即,它的声明和for同一函数中的一个循环)
  • 将 的值更改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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 请注意,现在存在一个选项“--runtime-tmpdir PATH” (5认同)