0

I have a personal python library consisting of several modules of scientific programs that I use. These live on a directory with the structure:

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
(...)

I am constantly making changes to these programs and adding new files. With my current setup at work, I share the same directory with several machines of different architectures. What I want is a way to use these packages from python in the different architectures. If the packages were all pure python, this would be no problem. But the issue is that I have several compiled binaries (as shown in the example) from Cython and from f2py.

Is there a clever way to repackage these binaries so that python in the different systems only imports the relevant binaries? I'd like to keep the code organised in the same directory.

Obviously the simplest way would be to duplicate the directory or create another directory of symlinks. But this would mean that when new files are created, I'd have to update the symlinks manually.

Has anyone bumped into a similar problem, or can suggest a more pythonic approach to this organisation problem?

4

3 回答 3

1

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

于 2013-01-14T10:54:39.580 回答
0

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

将带有目录的 exec-prefix 标志传递给 ./configure

有关更多信息:./configure --help 将为您提供以下信息:

安装目录: --prefix=PREFIX 在 PREFIX [/usr/local] 中安装与体系结构无关的文件 --exec-prefix=EPREFIX 在 EPREFIX [PREFIX] 中安装体系结构相关的文件

希望这可以帮助 :)

于 2013-06-18T21:23:43.153 回答
-1

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

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

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

不幸的是,Thorsten Krans 建议的选项不适用于这个问题。使用 distutils/setuptools/distribute 仍然需要将所有 python 源文件安装在每个架构的目录中,从而抵消了将它们放在单个目录中的优势。(这不是一个完成的包,但总是在进行中。)

于 2013-01-20T16:48:29.603 回答