“组织输入”中断脚本,这是怎么回事?

时间:2019-11-06 14:35:24

标签: python python-import

一个同事给我发送了一个脚本,它像这样开始:

from ourlibA import *
from ourlibB import *
import random
import time
from datetime import datetime

print datetime.now()

当我这样调用脚本时,它可以很好地工作。

但是我正在使用pycharm,在进行了一些编辑之后,我还使用了其“组织导入”功能,该功能将导入转换为:

import random
import time
from datetime import datetime

from ourlibA import *

from ourlibB import *

print datetime.now()

当我现在运行更改后的脚本时,最终得到:

  

打印datetime.now()

     

AttributeError:“模块”对象没有属性“现在”

现在我很困惑,导致了以下问题:

  • 这里到底会发生什么? datetime的导入仍然存在,那么该错误从哪里来?
  • 显然,问题出在以下事实:第二个示例最后而不是第一个导入我们自己的库。但是,我究竟如何找出导致该问题的库的哪一部分呢?

我知道这不是完整的mcve,但是这些私有库既庞大又私有。我更多地询问如何在python中解决这种“导入顺序”问题。

(我正在使用python 2.7.17)

1 个答案:

答案 0 :(得分:0)

我采取了一种“强力”方法,并简单地(递归地)手动查看了私有库的导入语句,以找出可以做到的

import datetime

因此:当该库最后一次导入时,它与前面的from datetime import datetime语句冲突。

通过更改客户端脚本,两个“快速解决方案”(更多:肮脏的黑客)起作用:

  • 删除from datetime import datetime
  • 改为使用“完整路径” print datetime.datetime.now()

“更好”的解决方案:退后一步,摆脱两个from X import *通配符语句。识别所有所需的特定名称需要花费一些时间,但是绝对值得花时间。