将大型非Python文件放入站点包中是否可以?

时间:2014-10-22 21:49:31

标签: python

我计划开发的产品将包括Python代码和zipfile(带有自定义扩展和自定义内容,不包含Python代码)。 Python代码将进入site-packages目录层次结构。我知道可以编写/生成自定义代码,知道在哪里找到zipfile(可能通过读取包含路径的文本文件),然后在导入Python代码时运行此代码。但是,是否也可以将zipfile放入site-packages目录层次结构中,这将是一个更简单的解决方案?从我已经完成的阅读(David Beazley" Python Essential Reference"以及各种网站)开始,我都没有看到有人提到将大型非Python文件放入网站 - 包裹,但我也没有看到任何人排除它。我倾向于避免将文件放在那里,但我只是想看看是否有一个完全没有理由的原因。

1 个答案:

答案 0 :(得分:2)

似乎可以将这些文件放在site-packages本身,但放在一个你喜欢的任何名称的目录中,与site-packages在同一层次结构中。 (你可以把它称为“堂兄”目录,如果不是兄弟姐妹那么。)正如@synthesizerpatel所提到的,distutils有一个数据文件的概念。实际上,有一个关键字“data_files”可用于指示此类型的目录。例如,您可以编写setup.py文件以包含如下所示的块:

setup(
    name="mypackage",
    version="R2014",
    description='My module',
    author='me',
    url='http://www.example.com/',
    platforms=['Linux', 'Windows', 'MacOS'],
    package_dir={'': 'dist'},
    packages=['my_package'],
    cmdclass={'build_py': BuildMyPackage},
    data_files=[('my_data', ['path/in/my/source/tree/to/some_large_file.txt'])]
)

在这种情况下,在Windows机器上执行:

python setup.py install
将在Python安装目录下创建一个目录(例如,c:\ Python33 \ my_data)并在其中放置some_large_file.txt。执行:
python setup.py install --user
将创建目录C:\ Users \ myuser \ AppData \ Roaming \ Python \ my_data并将some_large_file.txt放在那里。

稍后,如果要查找my_data目录,可以使用distutils.sysconfig.get_python_lib()或site.getsitepackages()查找系统site-packages目录,或使用site.getusersitepackages()查找用户站点-packages目录。然后,由于您知道那里的相对路径,您可以找到setup.py脚本创建的目录。 (或者,您可以使用来自site.getuserbase()的相对路径,而不是来自site.getusersitepackages()。)不幸的是,似乎没有一种简单的,规范的方法来确定哪些可能的目录(系统或用户)设置已执行。此外,有时这些功能提供了多种可能性,例如在这种情况下:

>>> site.getsitepackages()
['c:\\Python33', 'c:\\Python33\\lib\\site-packages']

因此,您可能需要添加一些自定义逻辑,例如:

  • 使用已知的相对路径搜索指定的目录, 对于site.getsitepackages()
  • 的所有元素
  • 如果未找到,请执行相同操作 对于site.getusersitepackages()
  • 的所有元素
  • 如果找不到,请返回“未找到”