我已经对此进行了一些阅读,看起来我已经在不知不觉中实现了被称为循环依赖的代码。我正在寻找最简单的方法来防止这个问题。
ImportError: Cannot import name X
我有一个基本上创建目录的脚本,然后在多个其他脚本中引用这些目录,因为脚本旨在避免文件路径的硬编码等等。
CaseManager.py
import sys, os
from os.path import join
def mkdir():
conPath = locateTool + locateCase
if not os.path.isdir(conPath):
try:
os.mkdir(conPath)
except OSError as exc:
if exc.errno != errno.EEXIST:
raise
d1 = conPath + '/LiveAcquisition/'
if not os.path.isdir(d1):
try:
os.mkdir(d1)
except OSError as exc:
if exc.errno != errno.EEXIST:
raise
d5 = d1 + '/Filepaths/'
if not os.path.isdir(d5):
try:
os.mkdir(d5)
except OSError as esc:
if exc.errno != errno.EEXIST:
raise
令人讨厌的代码片段是
ClusterInfo.py
import CaseManager
with open(d5 + '/Objects', 'a') as f:
f.write(object_path)
f.closed
执行的代码是:
Script1.py
import CaseManager
import ClusterInfo
def main():
CaseManager.mkdir()
CaseManager.main()
ClusterInfo.main()
if __name__ == '__main__':
main()
现在我明白导入CaseManager是非常糟糕的做法,并且应该调用每个单独的变量,这样可以防止命名空间的污染和碰撞变量。但是在开始阅读引用的解决方案后,他们建议不能使用x import y,因为在调用它时尚未创建该值(当我这样做时,我得到了一个错误导致我首先阅读那篇文章)
如何在没有错误的情况下编译脚本
NameError: global name 'd5' is not defined essentially
现在,当我使用CaseManager.d5
添加d5时,我得到了
AttributeError: 'module' object has no attribute 'd5'