如何在模块中包含 *.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

ma​​in.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 以外的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据命令行输入包含py文件?

Python setup.py 在 egg 中包含 .json 文件

如何在icarus verilog中包含文件?

当模块名称中包含“-”破折号或连字符时如何导入模块?

如何在 rake 任务中包含模块类?

如何在 Qt 5.4 应用程序中包含 QtScript 模块