Как включить в модуль файлы, отличные от * .py? - PullRequest
1 голос
/ 23 октября 2019

Я пытаюсь собрать модуль 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

file.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). Однако это не удовлетворительный обходной путь, потому что я не хочу называть файлы, отличные от python, с помощью .py.

1 Ответ

1 голос
/ 23 октября 2019

Похоже, что решение состоит в том, чтобы изменить setup.py с помощью:

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

ссылка

...