Невозможно импортировать все функции из пользовательской библиотеки

Я пытаюсь создать собственную библиотеку Python, которой можно будет поделиться через github. Я могу успешно установить его через pip install git+repo_url, но когда я пытаюсь ввести его в скрипт Python, только один из файлов в библиотеке распознается как модуль. Для справки, это структура моего репо:

mylib/
    utils/
        utils.py
    __init__.py
    plot.py
    colors.py
    codes.py
    fonts.py

По какой-то причине я могу импортировать только данные из Colors.py, но не другие файлы.

Когда я это делаю from mylib import colors, я могу получить доступ ко всему из Colors.py, но, например, from mylib import codes выдает ошибку:

ImportError: cannot import name 'codes' from 'mylib'

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

ОБНОВЛЯТЬ

После изменения моего __init__.py на содержание from .module import * для всех моих модулей я теперь получаю сообщение об ошибке ModuleNotFoundError: No module named 'mylib.utils' из from .plot import * в __init__.py. В настоящее время модули сюжета импортируют функцию из utils с помощью from mylib.utils.utils import function. Как правильно выполнить этот импорт?

Ваша ошибка ImportError: cannot import name 'fips' from 'mylib' подразумевает, что вы делаете что-то вроде from mylib import fips, включили ли вы from .codes import * в свой __init__.py файл?

Gabriel Tkacz 21.08.2024 00:34

Мне не хватало . перед именем файла. fips — это тот же файл, что и коды (я изменил некоторые имена, чтобы они были более общими, но забыл изменить ошибку. Теперь у меня возникают проблемы с __init__.py из-за импорта внутри файлов, чего не происходило при локальном тестировании Как правильно импортировать utils.py вplot.p?

itendswells 21.08.2024 16:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

К счастью, вариант использования по умолчанию для создания пакета довольно прост, но его очень трудно найти в документации: пустой pyproject.toml файл в каталоге непосредственно выше mylib может сделать это:


mylib/
    pyproject.toml  (0 bytes) (this is the git repo-root!)
    mylib/
        utils/
            utils.py
        __init__.py (0 bytes or containing "from . import plot", (one line for each script) for auto-imports)
        plot.py
        colors.py
        codes.py
        fonts.py

После установки pip, как в OP, он сам установится как пакет, и вы сможете делать такие вещи, как mylib.

Это работает благодаря import mylib.codes версии проекта по умолчанию pyproject.toml и инструменту сборки 0.0.0 при отсутствии каких-либо объявлений. Если вы когда-нибудь захотите что-то настроить, найдите минимальное содержимое файла setuptools. (В частности, имеет смысл автоматически найти код, если в проекте есть другие папки. Возможно, вам понадобится сеанс pyproject.toml со строкой [tool.setuptools] внутри файла.

(кроме того, переименование файла packages = ["mylib"] в utils/utils.py сделает его содержимое доступным как utils/__init__.py вместо mylib.utils.myutilfunc)

Спасибо! Это помогло с другими основными модулями, но с utils у меня все еще проблемы. Я все еще разрабатываю пакет и планирую включить в подпакет utils другие модули, поэтому не уверен, сработает ли ваше предложение. Есть ли у вас другие идеи, как это исправить? В настоящее время ничего в папке utils не распознается как модуль.

itendswells 21.08.2024 19:04

обязательно добавьте файл __init__.py внутрь utils . Он может быть пустым, или вы можете повторить стратегию выполнения from .utils import * (при этом будут прочитаны все глобальные переменные из файла utils.py в той же папке) и from . import network.py (что сделает mylib.utils.network доступным при импорте mylib.

jsbueno 21.08.2024 19:13

Чтобы было легче различать, я изменил utils/utils.py на utils/functions.py. Я добавил файл utils/__init__.py с from . import functions в нем. Однако я все еще не могу импортировать данные из utils. Например, в plot.py у меня сейчас есть from .utils import functions, и VSCode обнаруживает функции в functions.py, но когда я пытаюсь импортировать mylib, я получаю сообщение об ошибке No module named 'mylib.utils'.

itendswells 21.08.2024 20:04

Я решил проблемы с utils. Я понял, что неправильно включил это в свой setup.py.

itendswells 21.08.2024 21:06

с файлом pyproject.toml файл setup.py вам не понадобится. (любые метаданные, которые вы в него включаете, должны помещаться в pyproject.toml) — это новый способ работы с Python. Мне также нравится подход setup.py, но его следует исправить, чтобы вам не требовался pyproject.toml.

jsbueno 21.08.2024 21:27

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

Когда вы делаете from mylib import colors, это работает, потому что colors.py — это модуль верхнего уровня в вашем пакете. Однако когда вы пытаетесь импортировать codes, это не работает, поскольку code.py не импортируется в ваш файл __init__.py.

Чтобы это исправить, вам необходимо импортировать все модули в файл __init__.py, используя правильный синтаксис. поскольку вы используете Python3.x, следующий пример кода подойдет для файла __init__.py.

from . import colors
from . import codes
from . import fonts
from . import plot
from . import utils

обозначение с точкой (.) сообщает Python об импорте модулей из текущего пакета.

Что касается модуля utils, поскольку это подмодуль внутри пакета utils, вам необходимо импортировать его, используя правильный синтаксис. Вместо from mylib.utils.utils import function вы можете попробовать это.

from .utils.utils import function

запись через точку сообщает Python искать пакет utils внутри текущего пакета (mylib)

После внесения вышеуказанных изменений вы сможете правильно импортировать все модули, и библиотека должна работать должным образом.

Это определенно помогло, поскольку теперь функции других модулей, кроме цветов, работают, а утилиты по-прежнему нет. после изменения импорта с plot на from .utils.utils import function я все еще получаю ошибку ModuleNotFoundError: No module named 'mylib.utils'. И как правильно импортировать colors в plot?

itendswells 21.08.2024 18:49

Проблема с utils в том, что это подмодуль внутри пакета utils. вместо from .utils.utils import function попробуйте использовать from .utils import utils, а затем получить доступ к функции с помощью utils.function. Для импорта colors в plot вы можете использовать тот же синтаксис, что и раньше from . import colors. это импортирует модуль colors из текущего пакета (mylib). вplot.py сделайте что-то вроде этого from . import colors from .utils import utils

Vijay Panwar 21.08.2024 19:19

Я изменил его на это, и по какой-то причине он все еще не работает. Чтобы облегчить различение, я изменил название utils/utils.py на utils/functions.py. В настоящее время в utils/__init__.py есть from . import functions, а в plot.py у меня есть from .utils import functions. Странно то, что в plot.py VSCode обнаруживает функции из functions.py, но когда я пытаюсь импортировать пакет, я все равно получаю сообщение об ошибке from .utils import functions, говорящее об этом No module named mylib.utils.

itendswells 21.08.2024 20:00

Я решил проблемы с utils. Я понял, что неправильно включил это в свой setup.py.

itendswells 21.08.2024 21:06

Другие вопросы по теме