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

如何导入和使用从自身内的另一个文件导入类的python模块?,python,python-3.x,Python,Python 3.x,我是一名经验丰富的C#开发人员,但最近不得不编写一些python代码。我真的很喜欢这种语言,但我正在努力将一些代码拆分成模块。为简单起见,我基本上有两个模块,第一个模块如下所示: file1.py file2.py _初始值 这3个文件位于一个名为“mylibrary”的文件夹中,当我运行“python.\file1.py”时,一切正常。然后,使用以下setup.py将模块内置到控制盘中: import setuptools print(setuptools.find_packages())

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

file1.py

file2.py

_初始值

这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-mpipinstall--user mylibrary-1.0.0-py3-none-any.whl”安装生成的控制盘,该控制盘似乎工作正常

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

当我尝试运行“python.\consumer.py”(我在windows上使用的是Python3.7,顺便说一句)时,我得到了“ModuleNotFoundError:没有名为'file2'的模块”

我尝试过不同的导入方式,我尝试过在mylibrary模块中使用空的
\uuuu init\uuuu.py
,我还阅读了一些其他stackoverflow问题,这些问题至少有类似的问题,但我一直无法让它正常工作


我应该修改什么才能使其工作?

在Python 3中,隐式相对导入:

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

你的

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


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

from mylibrary.file2 import ...
或显式相对导入(使用前导点):

如果您真的需要它们,您还需要将
\uuuu init\uuuuu.py
中的导入转换为

from . import file1
from . import file2

除此之外,您的setuptools发行版似乎布局合理,适合我(顺便说一句,这是一个很好的示例!).

您是否验证了
file2
是否如预期的那样位于pip模块目录中?似乎
file2
位于
mylibrary
中,您应该将其作为
import mylibrary.file2
导入,而不仅仅是
import file2
@Eqomatic它确实在那里。@zvit.py该文件位于mylibrary文件夹中,并包含在控制盘中。我确实将其更新为“import mylibrary.file1,mylibrary.file2”,但这并没有解决问题。@Tom这是所需更改的一半(我在回答的第一个版本中遗漏了这一点),另一个是
file1.py
中的隐式相对导入也需要修复。这似乎对我的示例代码起到了作用。我正在尝试对我的真实代码进行类似的更改,并运行一个构建,看看这是否完全解决了我的问题,然后再回答。不过周末就要回家了,所以如果我第一次尝试的时候不成功的话,我要到星期一才能再去。(此项目的真实代码位于一个完全隔离的网络上:()我重新开始工作!感谢您的帮助和清晰的解释。@Tom很棒,感谢您让我知道。此外,如果您遇到此问题范围之外的打包问题,请随时打电话给我,如果可以,我很乐意帮助您;)
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"
    ],
)
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) }")
from file2 import ...
from mylibrary.file2 import ...
from .file2 import ...
from . import file1
from . import file2