我正在编写将要部署为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
),该documentation解释这个。 (请务必阅读以下两节。)
首先,正常的setuptools安装将把你的文件放在/ usr/local/share之类的地方,而不是在你的软件包内。
你可以重写这个,但是如果你这样做了,那就意味着它们可能在myapp.egg文件或者site-packages.zip中,或者甚至内置到.exe中。在任何这些情况下,您都无法通过路径访问它们。
解决所有这些问题的简单方法是使用pkg_resources
。然后,你的代码不需要知道有关鸡蛋或zip文件的任何内容,只需按名称打开资源即可。
当然这意味着你不能只是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'))
如果将包安装为鸡蛋,则这不起作用。如果有人使用你的模块来构建一个py2app/py2exe/pyinstaller/etc,它也不起作用。打包一个site-packages.zip或类似的包。所以,对于你计划作为一个软件包发布的东西来说,这是一个糟糕的主意。 – abarnert
即时通讯试试这个,它的工作在ubuntu'templatePath = path.join(os.path.dirname(myapp .__ file__),“config/template.myapp.flowini”)',如果我读你的权利,在其他操作系统,软件包部署在美化的zip文件中,而不是像linux这样的扩展文件夹,是吗? – scphantm
哦,我想我明白你现在在做什么。您不用复制文件,而是使用包资源的内容编写新文件。好吧,我会开始玩这个,看看它是如何去。谢谢 – scphantm
@scphantm:的确如此。这就是所有文件副本最终都要做的事情(好吧,可能还有设置权限和其他属性,并检查以确保你没有将文件复制到自身等等)。查看[shutil.py]的源代码(http://hg.python.org/cpython/file/2.7/Lib/shutil.py),了解每个函数的具体细节,但最终都归结为' copyfileobj',它只读取源文件和写入dest文件。因此,如果以其他方式获取源文件的内容,只需“写”dest文件即可。 – abarnert