setuptools:在包外添加附加文件
setuptools: adding additional files outside package
我有一个 python
应用程序,它有一个我无法更改的固定布局。我想用 setuptools 把它包起来,例如编写 setup.py
脚本。
使用官方文档,我能够编写第一个模板。但是,所讨论的应用程序使用了很多不明确属于任何包的附加数据文件。这是一个示例源代码树:
somepackage
__init__.py
something.py
data.txt
additionalstuff
moredata.txt
INFO.txt
问题出在这里:something.py
中的代码读取文件 moredata.txt
和 INFO.txt
。对于前者,我可以通过添加一个空的 additionalstuff/__init__.py
文件将 additionalstuff
提升到一个包并让 setuptools
拾取它来解决问题。但是我怎么可能将 INFO.txt
添加到我的 .egg
?
编辑
建议的解决方案使用类似
的方法
package_data = { '' : ['moredata.txt','INFO.txt']}
对我不起作用,因为文件 moredata
和 INFO.txt
不属于包,而是单独文件夹的一部分,该文件夹只是整个模块的一部分,而不是任何单独的包裹。
如上所述,在 moredata.txt
的情况下,这可以通过将 __init__.py
文件添加到 additionpythonalstuff
来解决,从而将其提升为一个包。但是,这不是一个优雅的解决方案,并且对于位于顶级目录中的 INFO.txt
根本不起作用。
解决方案
根据已接受的答案,这是解决方案
这是setup.py
:
from setuptools import setup, find_packages
setup(
name='mytest',
version='1.0.0',
description='A sample Python project',
author='Test',
zip_safe=False,
author_email='test@test.com',
keywords='test',
packages=find_packages(),
package_data={'': ['INFO.txt', 'moredata.txt'],
'somepackage':['data.txt']},
data_files=[('.',['INFO.txt']),
('additionalstuff',['additionalstuff/moredata.txt'])],
include_package_data=True,
)
这是 MANIFEST.in
:
include INFO.txt
graft additionalstuff
include somepackage/*.txt
您需要使用 package_data
。把你的setup.py
放在根目录下,那么你只需要:
package_data={'': [
'somepackage/*.txt',
'additionalstuff/*.txt',
'*.txt',
]
还有data_files
data_files=[("yourdir",
["additionalstuff/moredata.txt", "INFO.txt"])],
考虑一下要将这些文件放在哪里。 docs.
中的更多信息
我有一个 python
应用程序,它有一个我无法更改的固定布局。我想用 setuptools 把它包起来,例如编写 setup.py
脚本。
使用官方文档,我能够编写第一个模板。但是,所讨论的应用程序使用了很多不明确属于任何包的附加数据文件。这是一个示例源代码树:
somepackage
__init__.py
something.py
data.txt
additionalstuff
moredata.txt
INFO.txt
问题出在这里:something.py
中的代码读取文件 moredata.txt
和 INFO.txt
。对于前者,我可以通过添加一个空的 additionalstuff/__init__.py
文件将 additionalstuff
提升到一个包并让 setuptools
拾取它来解决问题。但是我怎么可能将 INFO.txt
添加到我的 .egg
?
编辑
建议的解决方案使用类似
的方法package_data = { '' : ['moredata.txt','INFO.txt']}
对我不起作用,因为文件 moredata
和 INFO.txt
不属于包,而是单独文件夹的一部分,该文件夹只是整个模块的一部分,而不是任何单独的包裹。
如上所述,在 moredata.txt
的情况下,这可以通过将 __init__.py
文件添加到 additionpythonalstuff
来解决,从而将其提升为一个包。但是,这不是一个优雅的解决方案,并且对于位于顶级目录中的 INFO.txt
根本不起作用。
解决方案
根据已接受的答案,这是解决方案
这是setup.py
:
from setuptools import setup, find_packages
setup(
name='mytest',
version='1.0.0',
description='A sample Python project',
author='Test',
zip_safe=False,
author_email='test@test.com',
keywords='test',
packages=find_packages(),
package_data={'': ['INFO.txt', 'moredata.txt'],
'somepackage':['data.txt']},
data_files=[('.',['INFO.txt']),
('additionalstuff',['additionalstuff/moredata.txt'])],
include_package_data=True,
)
这是 MANIFEST.in
:
include INFO.txt
graft additionalstuff
include somepackage/*.txt
您需要使用 package_data
。把你的setup.py
放在根目录下,那么你只需要:
package_data={'': [
'somepackage/*.txt',
'additionalstuff/*.txt',
'*.txt',
]
还有data_files
data_files=[("yourdir",
["additionalstuff/moredata.txt", "INFO.txt"])],
考虑一下要将这些文件放在哪里。 docs.
中的更多信息