如何在模块中包含 *.py 以外的文件?
Posted
技术标签:
【中文标题】如何在模块中包含 *.py 以外的文件?【英文标题】:How to include files other than *.py in a module? 【发布时间】:2020-02-19 05:16:28 【问题描述】:我正在尝试构建一个 python 3 模块。
我希望模块从.txt
文件中读取内容。
(我的用例是 .txt
文件是一个 Jinja2 模板。但我们暂时忽略它。)
当我使用pip
安装模块时,我发现只有.py
文件被复制,而.txt
文件被忽略。
这是为什么?
MWE
为简单起见,我避免使用 Jinja2。我只是想读取一个文件并返回它。
文件
文件树:
* mymodule/
* mymodule/
* __init__.py
* file.txt
* main.py
* setup.py
setup.py
from setuptools import setup
setup(name='mymodule',
version='0.3',
description='Test for stack overflow MWE',
license='Proprietary',
author='Matthew Davis',
url='https://example.com',
author_email='nobody@example.com',
packages=['mymodule'],
install_requires=[],
zip_safe=False)
__init__.py
from .main import main
main.py
import os
def main():
this_dir = os.path.dirname(os.path.abspath(__file__))
fname = 'file.txt'
print(f"Looking for file fname inside this_dir")
print(f"Files in this_dir: os.listdir(this_dir)")
with open(os.path.join(this_dir, fname),'r') as f:
content = f.read()
print("It works!")
return content
文件.txt
Here is my file.
步骤
使用 python 3。(我在 virtualenv 中做。)
pip3 install ./mymodule
import mymodule
mymodule.main()
预期行为
mymodule.main()
返回"Here is my file."
实际行为
>>> mymodule.main()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/ec2-user/environment/repo/workload/env/local/lib/python3.6/dist-packages/mymodule/main.py", line 2, in main
with open('file.txt') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'file.txt'
当我查看该回溯中的目录时:
ls /home/ec2-user/environment/repo/workload/env/local/lib/python3.6/dist-packages/mymodule/
我只看到
__init__.py
main.py
__pycache__
因此,这不仅仅是路径相对于何处的问题。 我需要的文件在安装过程中没有被复制。
如果我将 file.txt
重命名为 file.py
(并相应地更改 fname
),它就可以工作。
(如mymodule.main()
返回一个与file.py
的内容匹配的字符串)
不过,这不是一个令人满意的解决方法,因为我不想用 .py
命名非 python 文件。
【问题讨论】:
docs.python.org/3.8/distutils/… 【参考方案1】:看起来解决方案是修改setup.py
:
setup(
...
include_package_data=True,
package_data='':['*.txt']
)
link
【讨论】:
以上是关于如何在模块中包含 *.py 以外的文件?的主要内容,如果未能解决你的问题,请参考以下文章