Почему FileNotFound для аргументов метода внутри main.py
У меня есть эта проблема из следующего проекта python:
MyPackage
├──src
| ├──cust_function.py ----> class, functions
| ├──__init__.py
|
|--data --> folder where store raw or processed data
| |___init__.py
| |
|---config -> setup folder
| |-__init__.py
| |-config.json -> API parameters
|
└──main.py -> main file
Итак, в cust_function.py у меня есть несколько классов и методов, например
with open(filepath)
def get_file(filepath):
with open(filepath, 'r') as file:
....
return ....
Теперь проблема возникает из main.py, если я отправлю этот запрос:
from src.cust_function import get_file
filepath = "config/config.json"
get_file(filepath)
Результат FileNotFoundError от config.json
Я использовал os.path и sys.path по-разному и не работал,
fpath = os.path.join(os.path.dirname(__file__), 'src', 'config')
sys.path.append(fpath)
а еще я использовал
sys.path.append(project_name), and doesn't
Or I put same sys.path in __init__.py into config or src folder.
Of course, I tried directly in the same main.py and it works.
The idea is to understand how call methods and send arguments, like filepath, from main script and cust_function works fine.
Thanks.
1 ответ
Добавление файлов, отличных от Python, в ваши пакеты не так просто. Вы никогда не знаете, откуда будут выполняться ваши пакеты. Особенно, если вы на самом деле распространяете пакет позже. Для локального использования взгляните на importlib. Я использую следующий код:
from importlib import resources
import json
import config # your package
text = resources.read_text(config, "config.json")
conf = json.loads(text)
Я предполагаю, что вы настраиваете sys.path, чтобы исправить импорт? Есть ли особая причина, по которой вы используете
MyPackage
как пакет пространства имен (нет
__init__.py
)? Если вы работаете из родительского каталога MyPackage, вы должны иметь возможность импортировать все модули просто с помощью
from MyPackage.src import cust_function
. Нет необходимости настраивать
sys.path
.
В противном случае, если вы хотите, чтобы эти подпакеты были разделены (тогда MyPackage — странное имя, поскольку он не является пакетом), то расположение в этом каталоге должно сделать все подпакеты импортируемыми как есть.
Если вы находитесь в произвольном месте, вы можете
export PYTHONPATH=PathToParentDirOfMyPackage
или же
export PYTHONPATH=PathToMyPackage
в зависимости от ответа на пункты выше. Предполагая, что вы работаете в системе на основе Unix (Linux, Mac) и в оболочке.