我正在编写一个将部署为 python 模块的应用程序。我的问题是,使用它涉及到您使用应用程序的文件夹中的一个非常复杂的配置文件。我正在编写一个例程,检查文件是否存在于当前文件夹中,但我无法复制默认配置文件。
所以基本上,我希望能够复制位于
/usr/lib/python2-7/dist-packages/myapp/default.ini
到当前文件夹。如何在 win、osx 和 nix 系统上访问此文件的路径?
谢谢
我正在编写一个将部署为 python 模块的应用程序。我的问题是,使用它涉及到您使用应用程序的文件夹中的一个非常复杂的配置文件。我正在编写一个例程,检查文件是否存在于当前文件夹中,但我无法复制默认配置文件。
所以基本上,我希望能够复制位于
/usr/lib/python2-7/dist-packages/myapp/default.ini
到当前文件夹。如何在 win、osx 和 nix 系统上访问此文件的路径?
谢谢
假设您正在使用setuptools
(或distribute
……但如果是这种情况,您应该更新到setuptools
),文档对此进行了解释。(请务必阅读以下两节。)
首先,正常的 setuptools 安装会将您的文件放在 /usr/local/share 等下的某个位置,而不是在您的包中。
你可以覆盖它,但如果你这样做了,这意味着它们最终可能会出现在 myapp.egg 文件或 site-packages.zip 中,甚至内置到 .exe 中。在任何这些情况下,您根本无法通过路径访问它们。
所有这些问题的简单解决方案是使用pkg_resources
. 然后,您的代码不必了解鸡蛋或 zipfile 或其他任何内容,您只需按名称打开资源即可。
当然这意味着你不能只是shutil.copy(datapath, './default.ini')
; 你必须做with open('./default.ini', 'w') as f: f.write(datacontents)
。但这是唯一真正增加的复杂性。
在 Python 模块中,__file__
变量保存该模块文件的完整路径。因此,在一个myapp.something
模块中(因此,.../myapp/something.py
),您可以编写:
import os
os.path.abspath(os.path.join(__file__, '..', 'default.ini'))