【问题标题】:import python file in another directory failed在另一个目录中导入 python 文件失败
【发布时间】:2023-03-20 23:51:01
【问题描述】:

我遇到了一个很奇怪的问题:

我的文件结构是这样的:(core和test是目录)

 core
    ----file1.py

    ----__init__.py

 test

    ----file2.py

在file2中,我写道:

from core import file1

结果是:

ImportError: cannot import name file1

【问题讨论】:

  • 您是否尝试过类似 from ..core import file1 的相对导入?

标签: python import module directory


【解决方案1】:

必须在测试目录中创建__init__.py 文件:

因为需要__init__.py 文件才能使 Python 将目录视为包含包。

parent/
    child1/
        __init__.py
        file1.py

     child2/
        __init__.py
        file2.py

来自错误:

如果直接运行child2/file2.py 文件。您无法从child2/file2.py 访问child1/file1.py

因为只有从父目录才能访问子目录。

如果有这样的文件夹结构:

parent/
    child1/
         __init__.py
         file1.py
    child2/
         __init__.py
         file2.py
    file3.py

如果我们运行file3.py 文件。可以同时访问file3.py中的child1/file1.pychild2/file2.py
因为它是从父目录运行的。

如果我们需要从child2/file2.py访问child1/file1,我们需要设置父目录:

通过运行以下命令,我们可以实现它...

PYTHONPATH=. python child2/file2.py

PYTHONPATH=. 指父路径。然后从 shell 运行child2/file2.py 文件

【讨论】:

  • 对不起。尝试过,但失败了。还是那个 ImportError
【解决方案2】:

这不是一个奇怪的问题,导入根本就不能那样工作。

来自官方文档:https://docs.python.org/3/tutorial/modules.html

当导入名为 spam 的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,它会在变量 sys.path 给出的目录列表中搜索名为 spam.py 的文件。 sys.path 从这些位置初始化:

  • 包含输入脚本的目录(或当 没有指定文件)。
  • PYTHONPATH(目录名称列表,与 shell 语法相同 变量路径)。
  • 依赖于安装的默认值。

您可以查看相对导入,这是一个很好的来源:https://stackoverflow.com/a/16985066/4886716

该帖子中的相关信息是,除非您像 Shawn 一样将 core 添加到 PYTHONPATH,否则没有好方法。 L 说。

【讨论】:

  • 嘿,谢谢伙计。我在“core”中有一个名为“core-2”的目录,并且core-2中的python文件可以成功导入file1(file1在'core'中)。根据 tuto 的说法,它应该无法做到这一点。我在哪里误会了?
  • 听起来确实可行……说实话,我也不确定。也许我发布的第二个链接可能会有所帮助,我认为它解决了这个问题。
【解决方案3】:

当我尝试过你的案子时,我得到了

Traceback (most recent call last):
  File "file2.py", line 3, in <module>
    from core import file1
ImportError: No module named core

原因是Python 没有找到core。在这种情况下,您需要在系统路径中添加core,如下所示(在file2.py的最开头添加它们):

import sys,os
sys.path.append(path_to_core.py)

或者,如果你要使用命令行运行它,你可以简单地将以下内容放在file2.py的开头

import sys,os
sys.path.append(os.path.join(os.path.dirname(__file__),'../'))

这里,os.path.join(os.path.dirname(__file__),'../') 是说明file2.py 的路径。

【讨论】:

    猜你喜欢
    • 2020-09-18
    • 1970-01-01
    • 2017-09-12
    • 2021-08-17
    • 1970-01-01
    • 2023-02-02
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多