Как создать пакет таким образом, чтобы с помощью `import mypackage` импортировались нужные мне файлы

Я пытаюсь создать пакет 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

как это можно было сделать?

Почему в 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
0
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Учитывая следующую структуру каталогов, вы можете сделать это двумя способами.

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

Кроме того, для ясности лучше оставить имя пакета и имя модуля разными.

Спасибо за ответ, я бы не хотел размещать код, который хочу импортировать, внутри __init__.py. нет ли способа обойти запись функции непосредственно внутри __init__.py, импортировав ее каким-то образом? Это должно быть возможно, потому что, например, если вы напишете import pandas, вы можете напрямую превысить pandas.DataFrame, и я не вижу никакого DataFrame кода внутри главного панды __init__.py

yonatan medan 08.04.2019 09:45

Хорошо, это сработало! проблема заключалась в том, что я писал from mypackage import * вместо from .mypackage import *, и поскольку мой пакет и модуль были названы mypackage, это не вызвало никаких ошибок. пока я думал, что импортировал модуль, импортировал пакет.

yonatan medan 08.04.2019 13:04

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