Я пытаюсь создать пакет pip. моя файловая структура:
setup.py
README.md
LICENSE
mypackage/
mypackage.py
__init__.py
мой __init__.py
выглядит так:
from mypackage import *
мой пакет.py
def somefunc():
return "some value"
любой мой setup.py выглядит так:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name='mypackage',
version='0.0.1',
author = "Yonatan Medan",
description = "some description",
long_description=long_description,
long_description_content_type = "text/markdown",
packages=["mypackage"],
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
)
я упаковал пакет с python setup.py bdist_wheel
,
и установил его с помощью pip install dist/mypackage-0.0.1-py3-none-any.whl
проблема в том, что когда я пытаюсь импортировать его с помощью python
мне нужно сделать что-то вроде этого, чтобы импортировать somefunc
:
from mypackage.mypackage import somefunc
что я хочу:
from mypackage import somefunc
как это можно было сделать?
Учитывая следующую структуру каталогов, вы можете сделать это двумя способами.
package
├── hello.py
├── __init__.py
Либо определите функцию внутри __init__.py
, как показано ниже.
from . import hello
def somefunc():
print("Some function inside __init__.py")
Затем в repl вы можете сделать
>>> from package import somefunc
>>> somefunc
<function somefunc at 0x7f98e380d400>
>>> somefunc()
Some function inside __init__.py
>>>
Или вам нужно импортировать *
из модуля внутри вашего __init__.py
, как показано ниже.
from .hello import *
def somefunc():
print("Some function inside __init__.py")
А затем импортировать вот так
>>> import package
>>> package.greet()
Hello
>>> from package import *
>>> greet()
Hello
Кроме того, для ясности лучше оставить имя пакета и имя модуля разными.
Хорошо, это сработало! проблема заключалась в том, что я писал from mypackage import *
вместо from .mypackage import *
, и поскольку мой пакет и модуль были названы mypackage, это не вызвало никаких ошибок. пока я думал, что импортировал модуль, импортировал пакет.
Спасибо за ответ, я бы не хотел размещать код, который хочу импортировать, внутри
__init__.py
. нет ли способа обойти запись функции непосредственно внутри__init__.py
, импортировав ее каким-то образом? Это должно быть возможно, потому что, например, если вы напишетеimport pandas
, вы можете напрямую превыситьpandas.DataFrame
, и я не вижу никакогоDataFrame
кода внутри главного панды__init__.py