Ошибка импорта Python3 [дубликат]

Пакет import org.apache.commons.lang.SerializationUtils;

Существует метод SerializationUtils.clone(Object);

Пример

this.myObjectCloned = SerializationUtils.clone(this.object);
0
задан jfs 10 May 2016 в 14:48
поделиться

3 ответа

from __future__ import absolute_import является значением по умолчанию для Python 3. Поэтому оператор from calendar import isleap импортирует модуль верхнего уровня calendar.

Если вы видите другие результаты; это означает, что вы не используете Python 3 или пытаетесь запустить модуль python изнутри пакета в качестве скрипта (в самом каталоге myproject находится sys.path). Если последний, то ваш calendar.py становится модулем верхнего уровня и (из-за того, что текущий каталог появляется перед каталогами stdlib в sys.path), from calendar import isleap импортирует calendar.py из текущего каталога. «Никогда не добавляйте каталог пакета или любой каталог внутри пакета непосредственно к пути Python»

Чтобы этого избежать, не запускайте модули из пакетов python прямо, например, do не делаем это: cd myproject; python foo.py. Сделайте это вместо: python -mmyproject.foo (или вы можете определить, какие сценарии должны быть запущены в setup.py или , создать аналогичный скрипт вручную: from myproject import foo; foo.main() ).

Если вы хотите запустить пакет Python в качестве сценария, тогда создайте myproject/__main__.py, затем запустите python -mmyproject.


Если вы хотите сделать относительный импорт в Python 3; сделайте это явно, например, в myproject/foo.py:

from .calendar import something

Или выполните абсолютный импорт:

from myproject.calendar import something
2
ответ дан jfs 19 August 2018 в 12:50
поделиться

Похоже, что ваш путь или структура каталогов настроены неправильно.

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

myproject
├── calendar.py
├── foo.py
└── __init__.py

Кажется, что путь, который вы используете, фактически myproject. Значение calendar.py превращается в модуль корневого уровня calendar, а не myproject.calendar. Python предпочитает локальные модули для встроенных, поэтому импортирует ваш модуль calendar.

Более типично вы можете сделать что-то вроде этого.

MyProjectFolder
├── main.py
└── myproject
    ├── calendar.py
    ├── foo.py
    └── __init__.py

И затем запустите свою программу следующим образом:

#! /bin/bash
cd /path/to/MyProjectFolder
python main.py
2
ответ дан Dunes 19 August 2018 в 12:50
поделиться

Python проверит ваши локальные модули и загрузит их сначала с помощью import.

from calendar import isleap будет сначала искать модуль calendar в вашем пакете локали. Если не найден, он будет импортироваться из встроенной библиотеки calendar.

from .calendar import isleap будет импортироваться только из вашего языкового модуля calendar. Если не найден, возникает исключение ImportError.

Вот почему вы должны использовать относительный импорт в пакете.

Вы можете сделать такой трюк, чтобы импортировать встроенную библиотеку без проверки локальных модулей. Но это всего лишь трюк. Я никогда не буду использовать его в производстве. Лучше переименуйте свой модуль calendar.

import imp, sys
f, pathname, desc = imp.find_module("calendar", sys.path[1:])
calendar = imp.load_module("calendar", f, pathname, desc)
f.close()

from calendar import isleap
-1
ответ дан qvpham 19 August 2018 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: