Python包内的导入在python3中不起作用

Python包内的导入在python3中不起作用,python,python-3.x,python-2.7,python-import,python-packaging,Python,Python 3.x,Python 2.7,Python Import,Python Packaging,我不熟悉编写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_descriptio

我不熟悉编写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="jirikadlec2@example.com",
    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"
    ],
)
FirstPythonPackage/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
FirstPythonPackage/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存储库:

接下来,我尝试在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
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!
virtualenv -p python3 env3
source env3/bin/activate
(env3) pip install git+https://github.com/jirikadlec2/first-python-package
在Python2虚拟环境中成功运行包:

virtualenv -p python2 env2
source env2/bin/activate
(env2) pip install git+https://github.com/jirikadlec2/first-python-package
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!
virtualenv -p python3 env3
source env3/bin/activate
(env3) pip install git+https://github.com/jirikadlec2/first-python-package
在Python3虚拟环境中成功安装我的软件包:

virtualenv -p python2 env2
source env2/bin/activate
(env2) pip install git+https://github.com/jirikadlec2/first-python-package
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!
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'

我不明白恐怖的原因。模块_b似乎正确安装在包中,并且声明:from FirstPythonPackage import模块_b没有给我任何错误。我做错了什么?让包中的导入在Python2和Python3中工作的正确方法是什么?

您可能会遇到

兼容的方法是

from FirstPythonPackage import module_b
或例如

import FirstPythonPackage.module_b as mb


即使在Python2和Python3的软件包中。

请记住,在新代码中支持Python2的理由已经很少了。事实上,当我将uuu future uuuuu import absolute u import添加到模块a的开头时,我得到了相同的ImportError:在Python 2和3中都没有名为模块b的模块。