Python distutils 和代码中的字符串替换

2 投票
5 回答
297 浏览
提问于 2025-04-11 17:39

我经常需要在代码中写路径,以便找到数据或者某些特定工具的模块。到目前为止,我一直在使用autotools,因为在构建时用sed替换几个字符串实在太简单了。不过,我想找一种更符合Python风格的方法,也就是使用distutils或者其他推荐的构建/安装方式。不过,我在distutils的文档里从来没找到相关的信息,那么其他人是怎么解决这个问题的呢?

5 个回答

1

现在,把数据和代码打包在一起的最好方法是使用setuptools,并利用pkg_resources

from pkg_resources import resource_filename, resource_stream
stream = resource_stream("PACKAGE", "path/to/data_f.ile")

这样做的好处是,它也能和Python的egg文件一起使用。不过,我觉得有个缺点,就是你需要把数据文件放在代码目录里,这虽然是个常见的做法,但我个人对此有点不同意见。

至于Linux发行版,我可以合理地保证,如果你使用pkg_resources,你的程序在任何现代的Debian系统上都能顺利运行,不会有问题(也不需要补丁)。至于Fedora或openSUSE,我不太确定,但我猜应该也没问题。

在Windows上也能用,不过目前和py2exe不兼容,不过有一些简单的解决方法可以绕过这个问题。

1

好吧,使用标准库中的distutils,你可以处理“包数据”。这指的是那些存放在包内部的数据。这里有详细的说明。 但这样并不是最理想的,因为你需要用一些__file__的小技巧来在运行时找到数据的位置。

接着就有了setuptools(不在标准库里),它提供了在运行时查找这些数据位置的方式。这里有详细的说明。 不过,这也有自己的问题,比如在未安装的原始包中,它可能会找不到数据文件。

还有一些额外的第三方工具。我用过的一个是kiwi.environ。它提供了数据目录和运行时查找的功能,但我不推荐它用于一般用途,因为它主要是为PyGTK开发和Glade文件位置而设计的。

我想可能还有其他的第三方工具,其他人会进一步补充。

1

对于模块路径,常见的做法是把它们放在 .pth 文件里,具体可以参考 这里的说明site 模块提供了一个可以进行特定配置的空间,你可以利用它来调整你的环境设置。

撰写回答