Почему 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) и в оболочке.

Другие вопросы по тегам