импортировать модуль из другой папки python (ошибки) - PullRequest
0 голосов
/ 19 декабря 2018

Я новичок в Python.Я использую следующую структуру каталогов и пытаюсь импортировать модуль OrgRepo в Func1.Я использую код virtualenv и vs в качестве своей IDE.

src/ ├── Functions │ ├── Func1 │ └── Func2 └── Shared ├── __init__.py ├── Repositories │ ├── __init__.py │ ├── OrgRepo └── Utilities ├── __init__.py └── DictUtil Я также пробовал это без ` init .py '

Это мой ПУТЬ:

['/Users/username/Documents/Projects/myproject/name/src/Functions/Func1', '/Users/username/anaconda3/envs/my_virtual_env/lib/python37.zip', '/Users/username/anaconda3/envs/my_virtual_env/lib/python3.7', '/Users/username/anaconda3/envs/my_virtual_env/lib/python3.7/lib-dynload', '/Users/username/.local/lib/python3.7/site-packages', '/Users/username/anaconda3/envs/my_virtual_env/lib/python3.7/site-packages']

Я пробовал следующее для импорта OrgRepo в Func1:

1: from .Shared.Repositories import OrgRepo

ModuleNotFoundError: No module named '__main__.Shared'; '__main__' is not a package

2: from ..Shared.Repositories import OrgRepo '

ValueError: attempted relative import beyond top-level package

3: from src.Shared.Repositories import OrgRepo

ModuleNotFoundError: No module named 'src'

4: `от Shared.Импорт репозиториев OrgRepo1

'ModuleNotFoundError: No module named 'Shared'

5: Я использую VS Code и когда я пытаюсь сохранить файл:

Он автоматически меняется на: import OrgRepo import DictionaryUtilities import datetime import json import sys sys.path.insert(0, 'src/Repositories/')

6: import sys sys.path.insert( 0, '/Users/username/Documents/Projects/project/m/src/Repositories') import OrgRepo

и это:

sys.path.insert(0, 'Repositories') sys.path.insert(0, .'Repositories') sys.path.insert(0, ..'Repositories')

После запуска или сохранения код изменяется наthis: import OrgRepo import sys sys.path.insert( 0, '/Users/username/Documents/Projects/project/m/src/Repositories') и получил эту ошибку:

ModuleNotFoundError: No module named 'OrgRepo'

Мне удалось установить это с помощью PIP и импортировать его, но это не соответствует нашим потребностям.

Я прочитал эти сообщения: Импорт файлов из другой папки

Модули импорта Python, структура папокs

Как импортировать несколько модулей Python из других каталогов

Как правильно импортировать модули Python из соседней папки?

Я также пытался прочитать / понять несколько других постов.,,Я даже несколько раз пытался стучать по конденсатору Flux, но безрезультатно.,

РЕДАКТИРОВАТЬ: я использую этот код для загрузки в качестве функции лямбда AWS.Хотя решение sys.path работает локально, оно не подходит для моего рабочего процесса.Это требует от меня изменения sys.path для импорта при загрузке и вызывает проблемы с Intellisense.Я хотел бы иметь возможность импортировать модуль напрямую.например, import OrgRepo, поэтому Intellisense не выдает ошибок, и я могу заархивировать и загрузить свой пакет в AWS.У меня нет проблем с загрузкой пакета в AWS, когда я могу импортировать <module_name>.

. Я активирую свою среду в Anaconda, а затем экспортирую следующую переменную среды PYTHONPATH:

export PYTHONPATH=src/shared/repositories:src/shared/utilities

Я также пытался export PYTHONPATH=$PATH:src/shared/repositories:src/shared/utilities

Это работало некоторое время, и теперь я получаю PYTHON[unresolved-import] с IntelliSense.Кажется, я не получаю эту ошибку, когда пытаюсь запустить скрипт из каталога выше /src.

Я был бы очень признателен, если бы кто-нибудь показал мне, как я могу импортировать свои модули, используя стандартный import <module> и он постоянно работает.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Я думаю, что вы пытаетесь сделать что-то вроде ниже.Я очистил некоторые из имен каталогов (обычно каталоги строчные с подчеркиванием, а имена классов прописными), добавил расширения .py в файлы python и попытался создать минималистичную среду для репликации вашего сценария.Надеюсь, это полезно.

Настройка среды

$ mkdir src; mkdir src/functions; touch src/functions/func1.py; mkdir src/shared; mkdir src/shared/repositories; touch src/shared/repositories/org_repo.py

$ tree
.
└── src
    ├── functions
    │   └── func1.py
    └── shared
        └── repositories
            └── org_repo.py

# src/shared/repositories/org_repo.py
def a_cool_func():
    print(f'hello from {__file__}')

# src/functions/func1.py
import pathlib
import sys

file_path = pathlib.Path(__file__)
path = file_path.resolve().parents[2]
sys.path.append(str(path))

from src.shared.repositories.org_repo import a_cool_func

print(f'hello from {__file__}')

a_cool_func()

Запуск

# note that there is no significance to /Users/username/tmp/tmp/
# this is just the directory where the test environment was setup
$ python src/functions/func1.py
hello from src/functions/func1.py
hello from /Users/username/tmp/tmp/src/shared/repositories/org_repo.py
0 голосов
/ 19 декабря 2018

По существу, упомянуть, что каталог не может быть импортирован, но файл в каталоге может быть импортирован.

Допустим, у вас есть Org.py файл в OrgRepo, и вы можете сделать:

from src.Shared.Repositories.OrgRepo import Org

или, если вы хотите вызвать из него определенный метод, скажем do_it:

from src.Shared.Repositories.OrgRepo.Org import do_it

Подробнее

...