为不同的体系结构打包python目录

时间:2013-01-14 10:35:49

标签: python packages cython

我有一个个人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只导入相关的二进制文件?我想将代码组织在同一目录中。

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

是否有人遇到类似的问题,或者可以建议采用更加pythonic的方法解决此组织问题?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

  1. 将二进制扩展保留在单独的目录中,并将所有python包放在可在架构之间共享的公共目录中。然后可以为具有PYTHONPATH的不同体系结构选择单独的二进制扩展目录。
  2. 为不同的体系结构保留一个包含所有python文件和扩展名的公共目录。对于每个体系结构,使用程序包名称创建一个新目录。然后在每个目录中对所有python文件和二进制文件进行符号链接。这仍然允许代码所在的单个位置,代价是必须为每个新文件创建新的符号链接。
  3. 不幸的是,Thorsten Krans提出的选择对于这个问题是不可行的。使用distutils / setuptools / distribute仍然需要将所有python源文件安装在每个体系结构的目录中,否定了将它们放在单个目录中的优势。 (这不是一个完成的包,但总是在进行中。)

答案 2 :(得分:0)

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

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

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

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

希望这会有所帮助:)