ModuleNotFoundError:即使在黑客入侵sys.path()之后,也没有在python 3中命名的模块

时间:2018-04-24 23:12:37

标签: python-3.x

我有这个文件结构:

/home/test
         ├── dirA
         │   └── ClassA.py
         └── dirB
             └── Main.py

文件中包含以下内容:

ClassA.py

class ClassA:
    def __str__(self):
        return 'Hi'

Main.py

from dirA.ClassA import ClassA

class Main:

    def main():
        a = ClassA()

if __name__ == '__main__':
    Main.main()

我将当前目录更改为:

$ cd /home/test/dirB

这有效:

$ PYTHONPATH=/home/test python Main.py

这不是:

$ python Main.py

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

在Main.py中添加此行无效:

import os, sys
# Get the top level dir.
path = os.path.dirname(os.path.dirname(__file__)) 
sys.path.append(path)

仍然无法找到该模块!有很多类似的问题但是我无法以编程方式完成这项工作(跳过PYTHONPATH env var。)我知道dirs不是模块,文件可以在PyCharm中运行(是IDE修复{ {1}}?)

3 个答案:

答案 0 :(得分:2)

在尝试加载可能依赖于更改路径的任何程序包之前,您需要确保已更改sys.path - 否则您的脚本将在遇到时失败并import语句。换句话说,请确保您的Main.py开头为:

import os
import sys

path = os.path.join(os.path.dirname(__file__), os.pardir)
sys.path.append(path)

from dirA.ClassA import ClassA

确保最后一个import语句在更改的路径上运行。

答案 1 :(得分:0)

感谢所有帮助。根据建议,我添加了附加路径作为第一个语句。那还是行不通的。但后来我用了:

sys.path.append(sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))

这突然起作用了。仍然不确定为什么abspath有所作为,因为我得到的印刷路径已经是__file__的绝对路径。

答案 2 :(得分:0)

基于@zwer给出的答案,我们需要检查脚本是否以交互模式运行。如果是这样,那么我们可以使用@zwer提到的方法。如果不是这样,我们可以使用硬编码方式(这并不总是万无一失的。

# https://stackoverflow.com/questions/16771894/python-nameerror-global-name-file-is-not-defined
if '__file__' in vars():
    print("We are running the script non interactively")
    path = os.path.join(os.path.dirname(__file__), os.pardir)
    sys.path.append(path)    
else:
    print('We are running the script interactively')
    sys.path.append("..")