如何导入和使用从自身中的另一个文件导入类的python模块?

时间:2018-11-30 19:28:50

标签: python python-3.x

我是一位经验丰富的C#开发人员,但最近不得不编写一些python代码。我真的很喜欢这种语言,但是我正努力将一些代码拆分成模块。为简单起见,我基本上有2个模块,第一个看起来像这样:

file1.py

from file2 import addOperation, volumeOperation

class utils:

  def add(self, num1, num2):
    op = addOperation(num1, num2)
    return op.calculate()

  def volume(self, length, width, height):
    op = volumeOperation(length, width, height)
    return op.calculate()

def main():
  util = utils()
  print(f"Adding 2 and 3 produces { util.add(2, 3) }")
  print(f"Volume of a 2x2x2 cube is { util.volume(2,2,2) }")

if __name__ == '__main__':
  main()

file2.py

class addOperation:
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

    def calculate(self):
        return self.num1 + self.num2

class volumeOperation:
    def __init__(self, length, width, height):
        self.width = width
        self.height = height
        self.length = length

    def calculate(self):
        return self.width * self.height * self.length

_init __。py

import file1, file2

这3个文件位于一个名为“ mylibrary”的文件夹中,当我运行“ python。\ file1.py”时,一切正常。然后使用以下setup.py将模块内置到轮子中:

import setuptools

print(setuptools.find_packages())

setuptools.setup(
    name="mylibrary",
    version="1.0.0",
    author="me",
    author_email="me@me.com",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "Operating System :: OS Independent"
    ],
)

然后使用“ python -m pip install --user mylibrary-1.0.0-py3-none-any.whl”安装生成的车轮,该车轮似乎正常工作。

我的第二个模块是以下文件“ consumer.py”:

import mylibrary.file1

if __name__ == '__main__':
    util = mylibrary.file1.utils()
    print(f"Adding 2 and 3 produces { util.add(2, 3) }")
    print(f"Volume of a 2x2x2 cube is { util.volume(2,2,2) }")

当我尝试运行“ python。\ consumer.py”(我在使用python 3.7的Windows上,顺便说一句)时,我收到“ ModuleNotFoundError:没有名为“ file2”的模块”。

我尝试了不同的导入方式,尝试在mylibrary模块中使用空的__init__.py,并且阅读了其他一些至少有类似问题的stackoverflow问题,但我一直无法使它工作。

我应该对其进行哪些修改才能使其正常工作?

1 个答案:

答案 0 :(得分:3)

在Python 3中,隐式相对导入got removed

  

相对导入的唯一可接受语法是来自。[module]导入名称。所有导入表单均不以开头。被解释为绝对进口。 (PEP 0328

您的

from file2 import ...
file1.py 中的

是这样的隐式相对导入(即,它在Python 2中可以作为相对导入,但现在在Python 3中被视为绝对导入)。


因此,您需要将其更改为绝对导入:

from mylibrary.file2 import ...

显式相对导入(使用前导点):

from .file2 import ...

如果您确实需要它们,还需要将__init__.py中的导入内容转换为

from . import file1
from . import file2

除此之外,您的setuptools发行版似乎布置正确,并且对我有用(很好的BTW示例!)。