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






Вам нужно, чтобы сама папка 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 не распознается как модуль.
обязательно добавьте файл __init__.py внутрь utils . Он может быть пустым, или вы можете повторить стратегию выполнения from .utils import * (при этом будут прочитаны все глобальные переменные из файла utils.py в той же папке) и from . import network.py (что сделает mylib.utils.network доступным при импорте mylib.
Чтобы было легче различать, я изменил 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'.
Я решил проблемы с utils. Я понял, что неправильно включил это в свой setup.py.
с файлом pyproject.toml файл setup.py вам не понадобится. (любые метаданные, которые вы в него включаете, должны помещаться в pyproject.toml) — это новый способ работы с Python. Мне также нравится подход setup.py, но его следует исправить, чтобы вам не требовался pyproject.toml.
Проблема, с которой вы столкнулись, заключается в том, как вы структурируете свой пакет и импортируете файл __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?
Проблема с 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
Я изменил его на это, и по какой-то причине он все еще не работает. Чтобы облегчить различение, я изменил название 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.
Я решил проблемы с utils. Я понял, что неправильно включил это в свой setup.py.
Ваша ошибка
ImportError: cannot import name 'fips' from 'mylib'подразумевает, что вы делаете что-то вродеfrom mylib import fips, включили ли выfrom .codes import *в свой__init__.pyфайл?