【问题标题】:Python3 - ImportError: No module namedPython3 - ImportError:没有命名的模块
【发布时间】:2020-08-13 22:04:44
【问题描述】:

我有 2 个文件夹:

my_python
     code.py

MyCode
     TestEntry.py

当我运行以下命令时:

cd /data/my_python
python3 code.py

以上工作。

但是,如果我在我的主文件夹中然后运行这个:

python3 /data/my_python/code.py

我收到以下错误:

Traceback (most recent call last):
  File "/data/my_python/code.py", line 4, in <module>
    from TestEntry import TestEntry
ImportError: No module named 'TestEntry'

代码如下:

import sys
import os
sys.path.append(os.path.abspath('../MyCode'))
from TestEntry import TestEntry
TestEntry().start(507,"My Param1","/param2",'.xyz',509)

你能帮我解决这个问题吗?

【问题讨论】:

  • 你为什么期望这个模块存在?
  • 如果我转到文件夹 - 使用 cd /data/my_python,然后运行 ​​- python3 code.py,它确实有效。只是不是来自不同的文件夹。
  • 如果您从其他位置运行脚本,您添加到sys.path 的路径将不再正确。你必须相应地调整它。
  • 好的,但是怎么做呢?
  • 通过写正确的路径而不是错误的路径?看来必须是data/MyCode,而不是../MyCode

标签: python


【解决方案1】:

您正在使用sys.path.append(os.path.abspath('../MyCode')) 行添加到sys 的相对路径。相反,您需要相对于您正在调用的文件进行导入。试试这个:

import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from TestEntry import TestEntry
TestEntry().start(507, "My Param1", "/param2", '.xyz', 509)

【讨论】:

  • 但是我需要去另一个文件夹获取TestEntry,即/data/MyCode
  • 是的,os.path.dirname 两次返回 2 个文件夹。如果这不起作用,请尝试仅使用一个。这里的关键是您传递给它的__file__。它是运行此代码的文件的路径。从那里,您需要查看需要返回多少级别,以便 python 可以找到您的模块。
  • 是否需要添加 2 行:sys.path.append(os.path.dirname(os.path.dirname(file))) 和 sys.path。附加(os.path.abspath('../MyCode'))
  • 不,只是第一个sys.path.append(os.path.dirname(os.path.dirname(__file__)))sys.path.append(os.path.dirname(__file__))
【解决方案2】:

发生这种情况是因为,正如 @mkrieger1 所提到的,您的 sys.path 搞砸了。我有一个先前的答案here,它解释了如何设置它。 sys.path 搞砸了,我的意思是 python 将查看您正在运行的目录,而不是您正在运行的脚本所在的目录。这是推荐的方法:

import sys, os
sys.path.append(os.path.abspath(os.path.join('..', 'MyCode')))
... (your code)

import sys, os
sys.path.append(os.path.abspath(os.path.join(__file__, '..', 'MyCode')))
... (your code)

这样,python 也会在您正在运行的文件的目录中查找。

【讨论】:

  • 它似乎不起作用。我应该添加这两行 - sys.path.append(os.path.dirname(os.path.dirname(file))) 和 sys.path.append(os.path.abspath( '../MyCode'))
  • @dang -- 也许吧。如果您提供更好的文件结构说明,我们可能会提供更好的帮助。
  • 我在问题中添加了文件夹说明。
  • 由于某种原因,两者都不起作用,给出了同样的错误
  • 我在我的主文件夹中 - cd ~ 并运行 python3 /data/my_python/code.py