使用pyinstaller的备用/ tmp位置

时间:2013-09-17 04:30:57

标签: python bash pyinstaller

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

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

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

我的问题如下:

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

4 个答案:

答案 0 :(得分: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;
}

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

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

要运行此功能,请首先安装python-devel个软件包(yum install python-devel -y),否则会抛出Python.h isn't found

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

答案 1 :(得分:1)

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

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

顺便提一下,这种方法的优点是,如果你从其他人那里获得pyinstaller生成的二进制文件并且无法访问源代码,它也可以工作。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

--runtime-tmpdir PATH
  

以onefile模式提取库和支持文件的位置。如果这   给定选项,bootloader将忽略任何临时文件夹位置   由运行时操作系统定义。 _MEIxxxxxx-folder将被创建   这里。仅当您知道自己在做什么时,才使用此选项。