如何解决Python 和 iPython 子模块导入差异
我最近使用 pytz
将我的解决方案迁移到 dateutil.tz
。我已经用 iPython 测试了所有东西,而且效果很好。但是,在使用 python 进行生产时...错误!
谁能解释为什么 Python 和 iPython 对导入的处理方式不同,以及是否有办法让 Python 的行为与 iPython 的行为相同?
$ python3
Python 3.8.5 (default,Jul 21 2020,10:48:26)
Type "help","copyright","credits" or "license" for more information.
>>> import dateutil
>>> dateutil.__file__
'/usr/local/lib/python3.8/site-packages/dateutil/__init__.py'
>>> dateutil.tz
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
AttributeError: module 'dateutil' has no attribute 'tz'
>>>
$ ipython
Python 3.8.5 (default,10:48:26)
Type 'copyright','credits' or 'license' for more information
IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import dateutil
In [2]: dateutil.__file__
Out[2]: '/usr/local/lib/python3.8/site-packages/dateutil/__init__.py'
In [3]: dateutil.tz
Out[3]: <module 'dateutil.tz' from '/usr/local/lib/python3.8/site-packages/dateutil/tz/__init__.py'>
解决方法
因为IPython想变得太聪明了。无论出于何种原因,它已经导入了 dateutil.tz
,当您手动导入 dateutil
时,dateutil.tz
在您的主命名空间中可用。
但是作为一个子模块,如果你想使用它,你应该始终导入它。因此,您应该将 import dateutil
替换为 import dateutil.tz
,您的代码将在两种环境中都能正常工作。
$ python3
Python 3.8.5 (default,Jul 21 2020,10:48:26)
Type "help","copyright","credits" or "license" for more information.
>>> import dateutil.tz
>>> dateutil.__file__
'/usr/local/lib/python3.8/site-packages/dateutil/__init__.py'
>>> dateutil.tz
<module 'dateutil.tz' from '/usr/local/lib/python3.8/site-packages/dateutil/tz/__init__.py'>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。