Python проблема с импортом моих файлов в сценарии (не в консоли) - PullRequest
2 голосов
/ 16 марта 2020

я знаю, что у проблемы, о которой я спрашиваю, тысячи вопросов и ответов, но мне нужно объяснение моей проблемы spcifi c, потому что я впервые использую код, написанный другими, и я действительно запутался в импорте , Итак: я использую Pycharm, и я извлек весь код (организованный в каталогах) непосредственно из репозитория gitLab.

это структура:

C:\users\marco\PycharmProjects\Avv
└──ads-ai
     └──src
         └──dataElab
             └──dataprep.py
             └──datamod.py
         ├──doc2vec
         ├──logger
              └──log_setup.py
         ├──res
         ├──mod1.py
         ├──mod2.py
         ├──mod3.py
         └──rest
              └──api.py

мой стартовый скрипт - api. py, и мне нужно импортировать mod1.py туда -

, но начать писать

import mod1

выдает ошибку.

проблема также заключается в том, что на mod1, Есть другие импортные:

from logger import log_setup
from dataElab import dataprep, datamod

все импорты дают мне ошибку 'NoModuleFound'. Я попытался: -адобавить путь с sys.path.append - относительные пути (из .. import mod1), но дает мне ValueError: попытка реального импорта за пределы пакета верхнего уровня -absolute path

но ничего, у меня есть всегда ошибка «без модуля», для mod1 или для log_setup.

Я хочу использовать скрипт Pycharm, а не консоль Python. Если я проверю с помощью os.getwd () -> C: \ users \ marco \ PycharmProjects \ Avv \ ads-ai \ src \ rest (должно быть правильно).

и с sys.path - ->

['C: \ Users \ marco.onnis \ PycharmProjects \ Avvocatura2020 \ ads-ai \ src \ restAPI', 'C: \ Users \ marco.onnis \ PycharmProjects \ Avvocatura2020 ',' C: \ Users \ marco.onnis \ AppData \ Local \ Continuum \ anaconda3 \ envs \ Avvocatura2020 \ python36.zip ',' C: \ Users \ marco.onnis \ AppData \ Local \ Continuum \ anaconda3 \ envs \ Avvocatura2020 \ DLLs ',' C: \ Users \ marco.onnis \ AppData \ Local \ Continuum \ anaconda3 \ envs \ Avvocatura2020 \ lib ',' C: \ Users \ marco.onnis \ AppData \ Local \ Continuum \ anaconda3 \ envs \ Avvocatura2020 ',' C: \ Users \ marco.onnis \ AppData \ Local \ Continuum \ anaconda3 \ envs \ Avvocatura2020 \ lib \ site-packages ',' C: \ Users \ marco .onnis \ AppData \ Local \ Continuum \ anaconda3 \ envs \ Avvocatura2020 \ lib \ site-packages \ xlsxwriter-1.2.8-py3.6.egg ']

Мне очень жаль, если я спрашиваю опять такой тип вопросов, но у меня проблемы с пониманием концепции имя , main и все такое, и я не знаю, что делать в моем конкретном случае c (надеюсь, тогда я в целом пойму топи c)

спасибо большое!

1 Ответ

1 голос
/ 16 марта 2020

Первое, что я бы сказал, чтобы упростить это и помочь вашему пониманию, это иметь main.py в каталоге root.

C:\users\marco\PycharmProjects\Avv
└──ads-ai
 └──main.py  # main script to run your code
 └──src
     └──dataElab
         └──dataprep.py
         └──datamod.py
     ├──doc2vec
     ├──logger
          └──log_setup.py
     ├──res
     ├──mod1.py
     ├──mod2.py
     ├──mod3.py
     └──rest
          └──api.py

Здесь есть два способа импорта, используя __init__.py файлы или относительный импорт. Пример относительного импорта будет аналогичен приведенному ниже, где вы ссылаетесь на каталог (или подкаталоги с использованием точечной нотации)

main.py

from src import mod1  # imports mod1.py from '/src' folder
from src.rest import api  # imports api.py from '/src/rest' folder

Второй способ, который работает с использованием from x import y будет помещать пустой __init__.py файл в каждый из ваших каталогов

C:\users\marco\PycharmProjects\Avv
└──ads-ai
 └──main.py
 └──src
     └──__init__.py
     └──dataElab
         └──__init__.py
         └──dataprep.py
         └──datamod.py
     ├──doc2vec
     ├──logger
          └──__init__.py
          └──log_setup.py
     ├──res
     ├──mod1.py
     ├──mod2.py
     ├──mod3.py
     └──rest
          └──__init__.py
          └──api.py

Затем вы можете импортировать как этот

main.py

import mod1  # imports mod1.py
import api # imports api.py

Вы поэтому может иметь следующее

main.py

import api

api.py

import mod1

Вы должны отличаться при импорте из разных мест, так как вы можете получить конфликты имен для модулей, если они имеют одинаковое имя файла, только в разных каталогах. В этих случаях вы также должны добавить as к раздаче модулей с одинаковым именем

например

main.py

from src import mod1 as mod_one
from src.rest import mod1 as mod_1
...