如何从其他文件导入Python代码

时间:2019-10-08 00:38:06

标签: python python-3.x module python-3.6

我在linux系统上有一个简单的情况:

ls test_repo

example  __init__.py  text

text目录中,我只有2个文件:

__init__.py ex.py

example目录中,我又只有2个文件:

__init__.py test.py

ex.py中,我得到了代码:

def test():
    print(10)

现在,我要在文本目录中导入它:

from text.ex import test

print(test())

但是当我在示例目录中以及不在示例目录中运行文件时:python test.py

我得到了错误:

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    from text.ex import test
ModuleNotFoundError: No module named 'text'

如何导入功能?

我应该在__init__.py中放些东西吗?

3 个答案:

答案 0 :(得分:1)

在StackOverflow上查看this question。它有多个导入文件的示例,因此请使用最适合您情况的示例。

答案 1 :(得分:0)

对于每个遇到导入问题的人,请让我解释一下该工作原理

首先,当您将某些模块导入文件时,它如何知道在哪里找到该模块? 导入模块时,python在多个位置检查该模块。这些位置在sys.path中。 如果您打印sys.path,它将在运行import语句时给出python检查位置的列表。 在我的机器输出中看起来像这样 enter image description here

那么此列表中的值是什么

  1. 第一个值就是我当前脚本运行的目录
  2. 下一个值是python路径环境变量中列出的目录
  3. 标准库目录
  4. 第三方软件包的站点软件包目录

因此,python在运行导入时检查所有这些位置。

在示例目录中运行python test.py时,会发生这种情况

  1. Python将您当前脚本运行的位置添加到sys.path列表(即test_repo/example
  2. test.py文件具有来自text.ex模块的导入语句
  3. Python搜索所有sys.path列表以加载text.ex模块
  4. 由于ex.py文件位于test_repo/text模块内部,并且sys.path没有test_repo/text的位置,因此会出现错误:没有名为'text'的模块< / li>

答案 2 :(得分:0)

对于您来说,您可以将其添加到test.py的最开始的行

import sys
sys.path.insert(0, "..")

因为您的test.py位于example目录内,而不是root目录内。