Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python+;pyinstaller是否支持多个OS/版本的linux?_Python_Linux_Pyinstaller_Software Distribution - Fatal编程技术网

python+;pyinstaller是否支持多个OS/版本的linux?

python+;pyinstaller是否支持多个OS/版本的linux?,python,linux,pyinstaller,software-distribution,Python,Linux,Pyinstaller,Software Distribution,我已经用python编写了几个小脚本,并使用pyinstaller构建了二进制文件 当我在我的Ubuntu 16.04机器上构建它们时,它们在我构建它们的机器上运行良好。但是,将文件移动到Centos/Redhat 7.4机器上会导致GCLIB和其他.so版本依赖性错误 使用相同版本的Centos在docker上构建相同的二进制文件不会产生这些错误 如果我试着在Centos 6.6上运行在Centos 7.4上编译的二进制文件,我会再次出错——但在Centos 6.6上构建,它可以在Cento

我已经用python编写了几个小脚本,并使用pyinstaller构建了二进制文件

当我在我的Ubuntu 16.04机器上构建它们时,它们在我构建它们的机器上运行良好。但是,将文件移动到Centos/Redhat 7.4机器上会导致GCLIB和其他.so版本依赖性错误

  • 使用相同版本的Centos在docker上构建相同的二进制文件不会产生这些错误
  • 如果我试着在Centos 6.6上运行在Centos 7.4上编译的二进制文件,我会再次出错——但在Centos 6.6上构建,它可以在Centos 6.6上正常工作
现在,我已经使用Centos的较低版本来构建二进制文件,解决了这个问题

  • 我的具体问题是——在Python中,基于目标操作系统在不同的操作系统上构建二进制文件是一种常见的方法(假设只针对linux目标),还是我正在做的是一种解决这个问题的黑客/坏方法

我试图理解如何以标准方式处理这个问题。

只要pyinstaller生成的二进制文件只依赖于glibc,那么在现有的最旧系统上构建它应该是一种有效的方法,并且应该在未来的系统上运行

一般来说,glibc的设计是向后兼容的,因此针对较旧版本的glibc构建的应用程序仍将使用较新的glibc运行,但反之亦然。它通过符号版本控制实现这一点,在符号版本控制中,您链接到的每个符号都可以有一个与其关联的版本,并且在任何情况下,如果较新的glibc更改了某些函数的ABI,它还将有一个与旧符号版本公开的旧ABI兼容的例程,因此,与旧版本链接的应用程序将与兼容性例程动态链接,而如果您有一个与较新符号版本链接的应用程序,则在较旧的glibc中不会有较新版本可动态链接

虽然其他库也可以做到这一点,但没有多少库作者愿意这么做,因此较新的版本可能只是不兼容,而glibc开发人员通常试图保持兼容性

因此,是的,只要最终的二进制文件只链接到glibc,或其他遵循类似符号版本控制方案的库,以确保旧的二进制文件仍能正确链接到库的新版本,就完全可以根据旧版本进行构建,然后在各种Linux发行版的新版本上运行它,甚至整个发行版也是如此


不幸的是,如果针对较新的glibc进行链接,没有好的方法让链接器选择较旧的符号版本,因此通常最简单的方法是在Docker或其他类型的容器中进行选择,该容器包含您希望兼容的最旧glibc发行版。

Pyinstaller在Linux上不是一件大事。Windows作为目标操作系统更常见。在Linux上,更多的软件包是通过
pip
安装的,pip还负责二进制依赖关系。但它们是有问题的,因为需要安装完整的构建系统和库。有像Docker或AppImage(以及更多)这样的系统以空间为代价来解决这个问题。您需要将脚本转换为二进制文件吗?因为如果没有,那么你的问题就解决了。如果需要,您仍然可以为windows构建。您也可以阅读类似于
snap
的软件包。这些是脚本,但有时可能需要连接到数据库,然后使用外部库。目标服务器无法访问internet。这让我可以选择构建二进制文件并与ops团队共享。提供一个完整的依赖文件夹(我不确定它是否会一直工作)或设置一个pip repo(服务器没有internet访问权限)。阅读@Brian Campbell的回应。Docker似乎是一个合理的方式,让行动更容易。Docker在这里可能是一个过火的人。快照怎么样?很公平。回答了我的问题。谢谢!:)@MarcinOrlowski这就是我提到“或其他类型的容器”的原因。使用您选择的容器或构建系统技术,无论是
docker
snap
pbuilder
,还是其他什么。只要你能用它来运行你想要支持的最旧发行版的构建过程,你就应该很好。我的意思是docker比ie snap更不适合OP需求。并不是所有的容器都是相同的,而是有不同的名称。