Python относительный импорт с sys.path - PullRequest
0 голосов
/ 23 мая 2018

У меня странный импорт Python, и я не могу заставить его работать с любыми предложениями из других обсуждений.

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

Вот пример скрипта python, который содержит несколько классов:

/path/to/root/directory/aaa/bbb/ccc/utils.py

Текущий разработчик импортирует этоследующим образом:

from aaa.bbb.ccc import utils
utils.SomeClass.someMethod()

Все каталоги в дереве имеют файл __init__.py

Теперь я хочу вызвать модуль извне следующим образом:

import sys
sys.path.append('/path/to/root/directory')
from aaa.bbb.ccc import utils
utils.SomeClass.someMethod()

ThisНЕ работает, и выдает следующую ошибку:

from aaa.bbb.ccc import utils
ImportError: No module named ccc

Однако, небольшое изменение импорта работает:

import sys
sys.path.append('/path/to/root/directory')
from aaa.bbb.ccc.utils import *
SomeClass.someMethod()

Я не понимаю, почему работает 2-й ине 1й.Опять же, я не могу изменить существующий код, поэтому следующие 2 оператора должны работать с моим sys.path.append и import:

from aaa.bbb.ccc import utils
utils.SomeClass.someMethod()

Я не могу удалить utils из utils.SomeClass

Кто-нибудь знает, как мне этого добиться?

1 Ответ

0 голосов
/ 19 июня 2018

Это действительно не ответ, но я никак не могу вписать это в комментарий, не говоря уже о каком-либо нормальном форматировании.Приношу свои извинения, но, надеюсь, все еще может помочь нам добраться куда-нибудь.

Я подозреваю, что где-то в вопросе все еще не хватает некоторой информации.Я установил следующее дерево в /tmp/so/xxx:

.
└── aaa
    ├── __init__.py
    └── bbb
        ├── __init__.py
        └── ccc
            ├── __init__.py
            └── utils.py

__init__.py файлы пустые и utils.py говорит:

class SomeClass:
    @staticmethod
    def someMethod():
        print("FOO")

Что, если я правильно прочитал описание, должнобыть достаточно, чтобы повторить поведение.Теперь я пробую оба ваших фрагмента:

import sys
sys.path.append("/tmp/so/xxx")
from aaa.bbb.ccc import utils
utils.SomeClass.someMethod()

И запускаю:

$ python test1.py 
FOO

И второй:

import sys
sys.path.append("/tmp/so/xxx")
from aaa.bbb.ccc.utils import *
SomeClass.someMethod()

Запускается также:

$ python test2.py 
FOO

Я пробовал Python 3.6.5 и 2.7.15.Тот же результат.

Исходя из вашего вывода, я предполагаю, что вы используете Python 2. Единственный способ воспроизвести эту проблему (получить ту же ошибку) было удалить __init__.py из ccc/, нодругой синтаксис тоже не сработал бы.

Не могли бы вы опубликовать свое дерево и содержимое __init__.py файлов?Имея доступные данные, я, к сожалению, смог воспроизвести проблему.

...