2013-01-14 120 views
0

我有一个由我使用的几个科学程序模块组成的个人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只导入相关的二进制文件?我想保持代码组织在同一个目录中。

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

有没有人碰到类似的问题,或者可以建议对这个组织问题更pythonic方法?

回答

0

不幸的是没有办法做到这一点。一个python包必须完全驻留在一个目录中。 PEP 382建议支持可以拆分到不同目录的名称空间包,但它被拒绝。 (并且在任何情况下,这些都是特殊的包)。

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

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

Thorsten Krans建议的选项不幸的是不适合这个问题。使用distutils/setuptools/distribute仍需要将所有的python源文件安装在每个体系结构的目录中,否定将它们放在单个目录中的优势。 (这不是一个完整的包,但始终工作正在进行。)

1

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

+0

但不将setuptools的方式只是把包放到不同的目录?我想要的是保持源文件(.py,.pyx,.f)的集中版本以及独立于架构相关文件的位置的方法。 – tiago

0

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

传递EXEC前缀标志与目录运行./configure

欲了解更多信息:。/配置--help会给你以下几点:

安装目录: --prefix = PREFIX安装在PREFIX 架构无关的文件[在/ usr /本地] --exec前缀= EPREFIX安装架构相关的在EPREFIX [PREFIX]

希望文件这有助于:)