我有一个Python脚本,然后我通过pyinstaller2.0运行它来生成它的二进制文件。
python pyinstaller -F /path/to/python/script
运行二进制文件时,它默认使用/ tmp文件夹保存临时文件并运行安装程序。这在普通服务器和VPS上工作正常。但是,在禁用/ tmp(/tmp noexec
)的服务器上尝试安装时,安装将失败。
我的问题如下:
答案 0 :(得分:3)
@devnull建议的解决方案确实是在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
将被创建 这里。仅当您知道自己在做什么时,才使用此选项。