ModulenotFoundError:即使在hacking sys.path()之后,在python 3中命名的任何模



我有此文件结构:

/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()

我将当前的dir更改为:

$ 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修复了PYTHONPATH?(

您需要在尝试加载可能取决于更改的路径的任何软件包之前确保已更改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

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

感谢您的所有帮助。根据建议,我将附加路径添加为第一个语句。那仍然没有用。但是后来我使用了:

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

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

构建@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("..")

最新更新