Как импортировать файл из подкаталога в python из подпакета в другом каталоге? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующая структура каталогов в папке моих домашних проектов.

 |ALL-IN-ONE
    |demo
         |__init__.py
         |__main__.py
    |models
         |grpc
             |allinone_server.py

И я хочу импортировать из allinone_server.py функцию, определенную в main .py, которая называется images_demo.Я пытался

from demo.__main__ import images_demo

Это не работает.Как я могу импортировать это?Функция, которую я пытаюсь импортировать, находится внутри main .py, которая находится внутри демонстрационной директории.Я пытаюсь импортировать его из файла allinone_server.py в grpc.Я полагаю, что теперь ясно изложил свой вопрос.Вот целое дерево для проекта

├── demo
│   ├── __init__.py
│   ├── __main__.py
│   └── __pycache__
│       ├── __init__.cpython-36.pyc
│       └── main.cpython-36.pyc
├── description
├── environment.yml
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
├── imgs
│   └── 44.jpg
├── info
│   └── exclude
├── __init__.py
├── loggers
│   ├── __init__.py
│   └── __pycache__
│       └── __init__.cpython-36.pyc
├── models
│   ├── adience_large1.h5
│   ├── adience_small1.h5
│   ├── AgeModel.json
│   ├── detection_age_gender_large1.h5
│   ├── detection_age_gender_small1.h5
│   ├── detection_age_gender_smile_large1.h5
│   ├── detection_age_gender_smile_small1.h5
│   ├── detection_age_large1.h5
│   ├── detection_age_small1.h5
│   ├── detection_large1.h5
│   ├── detection_small1.h5
│   ├── grpc
│   │   ├── adele_2016.jpg
│   │   ├── allinone_client.py
│   │   ├── all_in_one_pb2_grpc.py
│   │   ├── all_in_one_pb2.py
│   │   ├── all_in_one.proto
│   │   ├── allinone_server.py
│   │   ├── benedict_cumberbatch_2014.png
│   │   ├── cat.png
│   │   ├── classroom_in_tanzania.jpg
│   │   ├── decoded1.py
│   │   ├── decoded.py
│   │   ├── elon_musk_2015.jpg
│   │   ├── laos.jpg
│   │   ├── model_face.jpg
│   │   ├── __pycache__
│   │   │   ├── all_in_one_pb2.cpython-36.pyc
│   │   │   ├── all_in_one_pb2_grpc.cpython-36.pyc
│   │   │   └── decoded.cpython-36.pyc
│   │   ├── sophia.jpg
│   │   ├── test
│   │   │   ├── __init__.py
│   │   │   ├── __pycache__
│   │   │   │   └── __init__.cpython-36.pyc
│   │   │   └── test_images
│   │   │       ├── adele_2016.jpg
│   │   │       ├── benedict_cumberbatch_2014.png
│   │   │       ├── classroom_in_tanzania.jpg
│   │   │       ├── elon_musk_2015.jpg
│   │   │       ├── __init__.py
│   │   │       ├── laos.jpg
│   │   │       ├── model_face.jpg
│   │   │       ├── sophia.jpg
│   │   │       ├── waaah.jpg
│   │   │       ├── woman.jpg
│   │   │       └── zebra_stripes.jpg
│   │   ├── waaah.jpg
│   │   ├── woman.jpg
│   │   └── zebra_stripes.jpg

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вы не можете импортировать функцию из другой папки напрямую, и для этого вам нужно использовать это:

import sys
sys.path.insert(0, "../../demo/")

Еще один шаг - переименовать __main__ в main.

Вот точный пример, который работал для меня:

Дерево:

.
├── demo
│   ├── __init__.py
│   ├── main.py
│   
└── models
    └── grpc
        └── allinone_server.py

main.py:

def images_demo():
    print("hello there")

Файл вызова (allinone_server.py) :

import sys
sys.path.insert(0, "../../demo/")

import main

main.images_demo()
0 голосов
/ 25 октября 2018

Итак, вы ссылались на main.py, но у вас также есть __main__.py в вашей структуре каталогов.Я предполагаю, что ваш каталог на самом деле содержит main.py вместо __main __. Py.

Чтобы импортировать из уровней в пакете, начните импорт с точки.Чтобы импортировать только одну функцию, вы должны использовать from .main import images_demo

Теперь давайте начнем с того, что main.py находится в grpc / вместе с allinone_server.py, затем мы переместим его в разные каталоги и посмотрим, как происходит импорт.изменения.

Если бы это было в grpc / from .main import images_demo

Если бы это было в моделях / from ..main import images_demo

Если бы это было в __ALL-IN-ONE / from ...main import images_demo

Если бы это было в __demo / from ...__demo.main import images_demo

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

Теперь предположим, что вы хотите импортировать весь файл main.py.Если бы он был в grpc / from . import main

Если бы он был в моделях / from .. import main

Если бы он был в __ALL-IN-One / from ... import main

Еслиэто было в __demo / from ...__demo import main

Наконец, точечная нотация для перемещения на уровень работает только в том случае, если файл, который использует его, находится в пакете, поэтому это будет работать нормально, если на верхнем уровне вы начнетезапрограммируйте область действия вне этого пакета, затем используйте from __ALL-IN-ONE.models.grpc import allinone_server

Однако, если вы запустите allinone_server.py напрямую, он не сможет импортировать что-либо выше этого, поскольку он не импортируется как часть пакета.Попробуйте, и дайте мне знать, если вам нужно лучшее объяснение.

Удачи!

...