【发布时间】:2012-01-27 13:08:52
【问题描述】:
我正在尝试在我的包的 distutils 中包含数据文件,然后使用相对路径引用它们(遵循http://docs.python.org/distutils/setupscript.html#distutils-additional-files)
我的目录结构是:
myproject/
mycode.py
data/
file1.dat
mycode.py中的代码,实际上是包中的一个脚本。它依赖于访问data/file1.dat,使用该相对路径引用它。在setup.py,我有:
setup(
...
scripts = "myproject/mycode.py"
data_files = [('data', 'myproject/data/file1.dat')]
)
假设用户现在使用:
python setup.py --prefix=/home/user/
然后mycode.py会出现在/home/user/bin/这样的地方。但是对data/file1.dat 的引用现在被破坏了,因为脚本存在于数据的其他地方。
我怎样才能从mycode.py找到myproject/data/file1.dat的绝对路径,以便我可以根据用户安装包的位置正确引用它?
编辑
当我用prefix=/home/user/ 安装它时,我得到data/file1.dat 在/home/user/ 中创建,这正是我想要的,唯一缺少的部分是如何以编程方式检索该文件的绝对路径,只给定一个相对路径而不知道用户安装软件包的位置。当我尝试使用package_data 而不是data_files 时,它不起作用 - 我根本无法在任何地方创建data/file1.dat,即使我删除了我的MANIFEST 文件。
我已经阅读了当前关于这个显然非常常见的问题的所有讨论。然而,所有建议的解决方案都没有处理我上面的情况,需要访问data_files 的代码是一个脚本,它的位置可能会根据@ 的--prefix 参数而改变987654342@。我能想到的解决这个问题的唯一方法是将数据文件添加到setup() 中的scripts=,如下所示:
setup(
...
scripts = ["myproject/mycode.py", "myproject/data/file1.data"]
)
这是一个可怕的 hack,但这是我能想到的唯一方法,以确保 file1.data 与 scripts= 中定义的脚本位于同一位置,因为我找不到任何独立于平台且对安装敏感的 API在用户运行setup.py install(可能使用--prefix= args)后恢复data_files 的位置。
【问题讨论】:
-
尝试将 mycode.__file__ 魔法变量插入每个模块?
-
@MikkoOhtamaa: __ file __ 不会给你安装模块的位置,它可以给你正在执行的文件的位置(所以如果你 setup.py 在 ~/ lib/site-packages/yourproject/ 你不一定会得到那个路径)
-
那不是真的。 module.__file__ 为您提供模块的加载位置,也就是它的安装位置?
-
@MikkoOhtamaa:你说得对,我收回我的声明
-
@MikkoOhtamaa 找出
mycode模块的位置如何帮助回答提出的问题是找出数据文件的位置?
标签: python packaging setuptools distutils python-module