为不同的架构打包python目录

2024-10-04 03:22:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个个人python库,由我使用的几个科学程序模块组成。它们位于一个目录中,其结构如下:

root/__init__.py   
root/module1/__init__.py
root/module1/someprog.py
root/module1/ (...)
root/module2/__init__.py
root/module2/someprog2.py
root/module2/somecython.pyx
root/module2/somecython.so
root/module2/somefortran.f
root/module2/somefortran.so
(...)

我经常对这些程序进行更改并添加新文件。在我当前的设置工作中,我与几个不同架构的机器共享同一个目录。我想要的是在不同的架构中使用python的这些包的方法。如果这些包都是纯python的,这就没有问题了。但问题是,我有几个编译过的二进制文件(如示例所示)来自Cython和f2py。在

有没有一种聪明的方法可以重新打包这些二进制文件,使不同系统中的python只导入相关的二进制文件?我想把代码组织在同一个目录中。在

显然,最简单的方法是复制目录或创建另一个symlinks目录。但这意味着当创建新文件时,我必须手动更新符号链接。在

有没有人遇到过类似的问题,或者可以建议用一种更像Python的方法来解决这个组织问题?在


Tags: 文件方法py目录soinit架构二进制
3条回答

可能您应该使用setuptools/distribute。然后可以定义一个setup.py,它根据当前平台编译所有文件,将它们复制到某个适当的目录中,并确保它们在sys.path中可用。在

不幸的是没有办法做到这一点。python包必须完全驻留在一个目录中。PEP 382建议支持可以在不同目录中拆分的命名空间包,但遭到拒绝。(无论如何,这些都是特殊的包装。)

由于python包必须在一个目录中,因此不可能将编译后的扩展模块混合用于不同的体系结构。有两种方法可以缓解此问题:

  1. 将二进制扩展放在一个单独的目录中,并将所有python包放在一个可以在体系结构之间共享的公共目录中。然后可以使用PYTHONPATH为不同的体系结构选择单独的二进制扩展目录。在
  2. 保存一个公共目录,其中包含不同体系结构的所有python文件和扩展名。对于每个体系结构,使用包名创建一个新目录。然后对每个目录中的所有python文件和二进制文件进行符号链接。这仍然允许代码驻留在一个单独的地方,代价是必须为每个新文件创建新的符号链接。在

不幸的是,托尔斯滕·克兰斯提出的方案不适用于这个问题。使用distutils/setuptools/distribute仍然需要将所有python源文件安装在每个体系结构的一个目录中,这抵消了将它们放在单个目录中的优势。(这不是一个完成的包,但始终在进行中。)

在编译python源代码时,您将执行以下操作。在

将exec prefix标志与目录一起传递给./configure

有关详细信息:./configure help将为您提供以下信息:

安装目录: prefix=prefix在prefix中安装与体系结构无关的文件 [/usr/本地] exec prefix=EPREFIX在EPREFIX中安装依赖于体系结构的文件 [前缀]

希望这有帮助:)

相关问题 更多 >