【问题标题】:How to include files other than *.py in a module?如何在模块中包含 *.py 以外的文件?
【发布时间】: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 文件。

【问题讨论】:

标签: python pip python-module file-extension


【解决方案1】:

看起来解决方案是修改setup.py

setup(
    ...
    include_package_data=True,
    package_data={'':['*.txt']}
)

link

【讨论】:

    猜你喜欢
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2021-07-20
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 2019-08-16
    相关资源
    最近更新 更多