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