Невозможно выполнить модуль в пакете

Я абсолютный новичок в Python:)

Python 3.6.4

Структура:

python-packaging-dependencies
    dist
        python-packaging-dependencies-1.0.tar.gz
    jsonops
        pyjo_demo.py
        pyjo_spec.py
        __init__.py
        __pycache__
    LICENSE.txt
    MANIFEST.in
    python_packaging_dependencies.egg-info
    README.rst
    setup.cfg
    setup.py
    __init__.py

Корень init.py:

from jsonops import *

jsonops /init.py:

__all__ = ['pyjo_demo','pyjo_spec'] 

pyjo_spec.py

from pyjo import Model, Field, RangeField, EnumField
from enum import Enum

class Gender(Enum):
    female = 0
    male = 1

class Address(Model):
    city = Field(type=str)
    postal_code = Field(type=int)
    address = Field()

class User(Model):
    name = Field(type=str, repr=True, required=True)
    age = RangeField(min=18, max=120)
    #  equivalent to: Field(type=int, validator=lambda x: 18 <= x <= 120)
    gender = EnumField(enum=Gender)
    address = Field(type=Address)

pyjo_demo.py

from pyjo_spec import Gender, Address, User
def to_dictionary():
    u = User(name='john', age=18, address=Address(city='NYC'))
    print(u.to_dict())
    # {
    #     "name": "john",
    #     "age": 18,
    #     "address": {
    #         "city": "NYC"
    #     }
    # }

def from_dictionary():
    u = User.from_dict({
        "name": "john",
        "gender": "male",
        "age": 18,
        "address": {
            "city": "NYC"
        }
    })

    print(u)
    # <User(name=john)>

    print(u.gender)
    # Gender.male

    print(u.address.city)
    # NYC

Работает нормально БЕЗ упаковки - я перехожу в каталог и вызываю модуль pyjo_demo

E:\python-packaging-dependencies\jsonops>python
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]
 on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyjo_demo
>>>
>>> pyjo_demo.to_dictionary()
{'name': 'john', 'age': 18, 'address': {'city': 'NYC'}}
>>> pyjo_demo.from_dictionary()
<User(name=john)>
Gender.male
NYC
>>>
>>>

Теперь я создаю пакет и устанавливаю его вручную. Пакет успешно установлен и также указан в списке:

E:\python-packaging-dependencies>pip install dist\python-packaging-dependencies-1.0.tar.gz
Processing e:\python-packaging-dependencies\dist\python-packaging-dependencies-1.0.tar.gz
Collecting pyjo (from python-packaging-dependencies==1.0)
  Using cached pyjo-2.0.0.tar.gz
Requirement already satisfied: six in e:\development\software\environments
\python3\3.6.4\lib\site-packages (from pyjo->python-packaging-dependencies==1.0)

Installing collected packages: pyjo, python-packaging-dependencies
  Running setup.py install for pyjo ... done
  Running setup.py install for python-packaging-dependencies ... done
Successfully installed pyjo-2.0.0 python-packaging-dependencies-1.0

E:\python-packaging-dependencies>pip freeze --local
certifi==2018.1.18
chardet==3.0.4
click==6.7
idna==2.6
pkginfo==1.4.1
pyjo==2.0.0
python-packaging-dependencies==1.0
requests==2.18.4
requests-toolbelt==0.8.0
six==1.11.0
tqdm==4.19.5
twine==1.9.1
urllib3==1.22

Даже если я не уверен, что записи в init.py верны, код должен работать, если я вручную выполню все операции импорта:

    Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]
     on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    >>> import jsonops
    >>>
    >>> pyjo_demo.to_dictionary()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'pyjo_demo' is not defined
    >>>
    >>> import pyjo_demo
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ModuleNotFoundError: No module named 'pyjo_demo'
    >>>
    >>> from jsonops import pyjo_demo
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "E:\Development\Software\Environments\Python3\3.6.4\lib\site-packag
    es\jsonops\pyjo_demo.py", line 1, in <module>
        from pyjo_spec import Gender, Address, User
    ModuleNotFoundError: No module named 'pyjo_spec'
    >>>
    >>> import jsonops.pyjo_spec
>>> import jsonops.pyjo_demo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "E:\Development\Software\Environments\Python3\3.6.4\lib\site-packag
es\jsonops\pyjo_demo.py", line 1, in <module>
    from pyjo_spec import Gender, Address, User
ModuleNotFoundError: No module named 'pyjo_spec'

Какую ошибку я не могу найти?

********** Edit-1 ********** Согласно комментарию Гиласа БЕЛХАДЖ, имя подкаталога изменилось с "json" на "json-custom". Теперь я вообще ничего не могу импортировать.

********** Edit-2 ********** Изменено имя подкаталога с "json-custom" на "jsonops". Та же ошибка

1 ответ

Решение

Импортируя jsonops, вы не импортируете файлы в пакете. Вы должны использовать from jsonops import pyjo_demo,

Затем выполнение кода дает еще одну ошибку, потому что pyjo_spec не является модулем:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "~/PycharmProjects/test/jsonops/pyjo_demo.py", line 1, in <module>
    from pyjo_spec import Gender, Address, User
ModuleNotFoundError: No module named 'pyjo_spec'

Чтобы исправить эту ошибку, вы можете изменить импорт в pyjo_demo.py на import jsonops.pyjo_spec,

pyjo_demo.py затем становится:

from jsonops.pyjo_spec import Gender, Address, User
def to_dictionary():
    u = User(name='john', age=18, address=Address(city='NYC'))
    print(u.to_dict())
    # {
    #     "name": "john",
    #     "age": 18,
    #     "address": {
    #         "city": "NYC"
    #     }
    # }

def from_dictionary():
    u = User.from_dict({
        "name": "john",
        "gender": "male",
        "age": 18,
        "address": {
            "city": "NYC"
        }
    })

    print(u)
    # <User(name=john)>

    print(u.gender)
    # Gender.male

    print(u.address.city)
    # NYC
Другие вопросы по тегам