Импорт внутри пакета Python не работает в python3

Я новичок в написании пакетов Python и пытаюсь понять, как импорт внутри пакета работает в Python2 и Python3.

Структура моего пакета:

LICENSE
README.md
setup.py
FirstPythonPackage
    __init__.py
    data.json
    module_a.py
    module_b.py

setup.py:

import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="FirstPythonPackage",
    version="1.0.2",
    author="jirikadlec2",
    author_email="[email protected]",
    description="my first python package",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/jirikadlec2/first-python-package",
    packages=setuptools.find_packages(),
    install_requires=["numpy"],
    package_data={"FirstPythonPackage": ["data.json"]},
    classifiers=[
        "Development Status :: 3 - Alpha"
    ],
)

ПервыйPythonPackage/module_b.py:

import numpy as np

def run_helper(options):
    my_data = np.array([[1, 2],[2, 1]])
    my_result = my_data * 2
    print("module_b, run_helper completed with options: " + options)
    return my_result

ПервыйPythonPackage/module_a.py:

import module_b

def do_stuff():
    final_result = module_b.run_helper("default_options")
    if final_result:
        print("module_a, do_stuff completed successfully!")
    else:
        print("module_a, error calculating result!")

Я создал репозиторий GitHub для своего пакета по адресу: https://github.com/jirikadlec2/first-python-package

Затем я попытался установить и запустить свой пакет в виртуальной среде Python2 и Python3. Моя операционная система — Ubuntu Linux 16.04.

Установка в виртуальной среде Python2 (успешно):

virtualenv -p python2 env2
source env2/bin/activate
(env2) pip install git+https://github.com/jirikadlec2/first-python-package

Запуск пакета в виртуальной среде Python2 (успешно):

source env2/bin/activate
(env2) python
Python 2.7.12 (default, Nov 12 2018, 14:36:49) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from FirstPythonPackage import module_a
>>> module_a.do_stuff()
module_b, run_helper completed with options: default_options
module_a, do_stuff completed successfully!

Установка моего пакета в виртуальной среде Python3 (успешно):

virtualenv -p python3 env3
source env3/bin/activate
(env3) pip install git+https://github.com/jirikadlec2/first-python-package

Запуск моего пакета в виртуальной среде Python3 завершается сбоем из-за ошибки импорта:

(env3) python3
Python 3.5.2 (default, Nov 12 2018, 13:43:14) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from FirstPythonPackage import module_a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
  File "/home/jiri/github/package_test/env3/lib/python3.5/site-packages   /FirstPythonPackage/module_a.py", line 1, in <module>
  import module_b
ImportError: No module named 'module_b'

Я не понимаю причину ошибки ImportError. module_b кажется правильно установленным в пакете, и утверждение: from FirstPythonPackage import module_b не дает мне никаких ошибок. Что я делаю неправильно и как правильно заставить импорт внутри моего пакета работать как в Python2, так и в Python3?


person jirikadlec2    schedule 11.09.2019    source источник
comment
Пожалуйста, помните, что сейчас очень мало причин поддерживать Python 2 в новом коде. pythonclock.org   -  person AKX    schedule 11.09.2019


Ответы (1)


Скорее всего, вы сталкиваетесь с абсолютным импортом и включаете from __future__ import absolute_imports в своем Код Py2 также сломает его.

Совместимый способ - просто

from FirstPythonPackage import module_b

or (e.g.)

import FirstPythonPackage.module_b as mb

or

import .module_b as mb

даже внутри вашего пакета как в Python 2, так и в Python 3.

person AKX    schedule 11.09.2019
comment
Действительно, когда я добавляю from __future__ import absolute_import в начало module_a, я получаю один и тот же ImportError: No module named module_b как в Python 2, так и в 3. - person jirikadlec2; 11.09.2019