在python包中包含非python文件

时间:2019-06-20 14:29:16

标签: python python-3.x pip package manifest

我创建并发布了一个Python程序包,但我无法让它包含文本文件。

这是存储库:https://github.com/void4/gimpscm

我需要包括的文件是procdump.txt,位于gimpscm目录中。

所以布局是这样的:

setup.py
setup.cfg
MANIFEST.in
gimpscm/
       /__index__.py
       /procdump.txt
       /(other .py files)

我尝试过:

  • 在setup.py中包含package_data指令
  • 各种MANIFEST.in指令

当前的setup.py包括:

  package_data = {"gimpscm": ["gimpscm/procdump.txt"]},
  include_package_data=True,

MANIFEST.in包含:

recursive-include gimpscm *.txt

包含txt文件,就像.py文件一样,包含在dist目录的zip的gimpscm子目录中。但是当我pip install gimpscm时,该文件只是没有安装。

我以这种方式发布软件包:

python setup.py sdist
twine upload dist/*

在pypi网站上,上载的包确实包含txt文件,而pip install中没有包含该文件。

到目前为止,此过程非常令人沮丧,Stackoverflow和其他站点没有给出明确的答案。我已经尝试了MANIFEST.in和setup.py指令方法的每种组合。它仍然不起作用。 Python文档也太复杂了,我不清楚。

3 个答案:

答案 0 :(得分:2)

include_package_datasetuptools发行版的一部分,而不是distutils 尝试如下操作

  from setuptools import setup, find_packages

  setup(name="",
        version="0.1.0",
        packages=find_packages(),
        include_package_data=True,
        setup_requires=["pytest-runner"],
        tests_require=["pytest",
                       "mock"],
        test_suite="pytest",
        install_requires=[],
        entry_points={"console_scripts": []})

答案 1 :(得分:1)

您同时使用MANIFEST.in和package_data,因为您提供了两个很容易彼此矛盾的事实来源,所以许多资料都不鼓励这种用法。

仅使用MANIFEST.in且include_package_data = True

其他来源: https://blog.ionelmc.ro/presentations/packaging/#slide:15

答案 2 :(得分:1)

解决方案是@ m.rp和@vin的答案的组合:

代替from distutils.core import setup 使用

from setuptools import setup

在setup()调用中包含以下参数

include_package_data=True,

并且仅使用MANIFEST.in包含文件,该目录是从MANIFEST.in文件所在的位置相对地指定目录的。

recursive-include gimpscm *.txt

这真是一个巨大的PITA。谢谢您的回答!