Python ImportError / ModuleNotFoundError в собственном пакете в Eclipse PyDev - PullRequest
0 голосов
/ 08 февраля 2019

Решено, спасибо!

Допустим, у меня есть самописный модуль, расположенный под C:\mymodules\general, который содержит файлы foo.py и __init__.py.

Теперь я хочу импортировать функцию bar(), которая находится внутри foo.py, в скрипт в совершенно другом месте.

Почему это не работает?

import sys
sys.path.append(r"C:\mymodules")
from general import foo

foo.bar()

Я получаю ImportError: cannot import name 'foo'

То же самое, если вместо этого добавить C:\mymodules\general к пути.

В качестве альтернативы я также попытался

import sys
sys.path.append(r"C:\mymodules")
import general.foo

foo.bar()

Здесь я получаюModuleNotFoundError: No module named 'general.foo'; 'general' is not a package.

Почему бы вообще не быть пакетом?Я думал, что требование «содержит __init__.py» (и модуль, который я хочу импортировать, конечно)?

Это все Python3, использующий PyDev в Eclipse под Windows7.

Можеткто-нибудь подскажет, что не так и как это сделать вместо этого?


Редактировать: файл, действительно, уже называется __init__.py, так что это не проблема.

__init__.py уже содержит строку

__all__ = ["foo"]

Редактировать 2: Как ни странно, следующие работы:

import sys
sys.path.append(r"C:\mymodules")
from general import *
bar()

Я действительно нехочу сделать import *, хотя.Конечно, должен быть более чистый путь?


Редактировать 3: Когда я запускаю его из IDLE, он работает!(Первый код, то есть.) Но в Eclipse PyDev я все еще получаю ту же ошибку.Почему?

Ах!Решение найдено!(см. ответ ниже, чтобы закрыть это).

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Решение найдено. headdesk

В Pythonpath PyDev (сконфигурирован для всей рабочей области) у меня был другой пакет, содержащий модуль , который называется general.py.Переводчик обнаружил это до того, как дошел до моего пакета general, поэтому в сообщении general is not a package упоминается модуль с тем же именем.

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

0 голосов
/ 08 февраля 2019

При использовании файла init он должен быть с подчеркиванием, как говорит Робин Зигмонд.

__init__.py

, если это не работает для вас, вы можете попробовать написать вinit файл

 from foo import bar

или

 from foo.py import *

Смотрите здесь

...