编程语言
首页 > 编程语言> > Python导入被标准库覆盖(Python 2.4)

Python导入被标准库覆盖(Python 2.4)

作者:互联网

我有一个python包我正在编写,我遇到的问题是导入标准库而不是我的文件,因为名称冲突.

例如,如下所示的文件结构:

包/ __ init__.py

# No data in this file

包/ module.py

#!/usr/bin/env python
print 'Loading module.py'
import signal

包/ signal.py

#!/usr/bin/env python
print 'Loading signal.py'

运行时我得到以下结果:

$./module.py
Loading module.py

我想得到:

$./module.py
Loading module.py
Loading signal.py

实际问题:

因此,当我运行module.py时,它的导入信号将转到stdlib版本.我怎样才能强制module.py导入signal.py呢?

如标签中所述,这需要能够在python-2.4.3上运行.虽然这是旧版本,但它包含在RHEL 5中.

一些额外的信息

只是为了获得更多信息,我明确地进行了以下设置:

[10:30pm][~/test] tree .
.
|-- package
|   |-- __init__.py
|   |-- module.py
|   `-- signal.py
`-- script

[10:30pm][~/test] cat script
#!/usr/bin/env python
from package import signal

[10:30pm][~/test] cat package/__init__.py

[10:30pm][~/test] cat package/module.py 
#!/usr/bin/env python
print "Loading module.py"
import signal

[10:30pm][~/test] cat package/signal.py 
#!/usr/bin/env python
print "Loading signal.py"

[10:30pm][~/test] python ./script
Loading signal.py

[10:32pm][~/test] python ./package/module.py 
Loading module.py

[10:32pm][~/test] python -m package.module
python: module package.module not found

请注意,当我运行./package/module.py时,未触发./package/signal.py中的print语句.这意味着加载的信号是stdlib中的信号.

解决方法:

这种情况下的问题是内置信号模块是作为解释器启动过程的一部分导入的.所以当你的module.py中的代码运行时,在名称信号下的sys.modules中已经存在一个条目,内置模块作为其值.由于sys.modules是import语句的第一个位置,它将返回该内置模块并停在那里.它甚至懒得找你自己的自定义signal.py.

我可以想到三个解决方案:

>重命名您的模块.这是最简单的解决方案.您不必担心模块名称与已安装的软件包(egg)发生冲突,因为通常import语句将按sys.path指定的顺序搜索目录,而当您运行解释器时,当前的工作目录是第一个名单. signal是一种特殊情况,因为它在代码运行之前自动导入,但是有一些数量有限的模块是真的,那些是你必须避免名字冲突的模块.
>您可以使用del sys.modules [‘signal’]并用自己的自定义信号模块替换该条目.除非您的模块真正意图成为内置信号的直接替代品,否则不要实际执行此操作.如果你这样做,那么从那一点开始运行导入信号的任何代码都将获得你的版本,而不是内置版本,这可能会对需要信号模块运行的任何内部代码造成严重破坏.
>您可以使用imp module访问导入功能的内部,或至少等效的代码,这将允许您绕过sys.modules的检查.

如果您确实需要这样做,可以使用以下代码示例:

import imp, sys

f, path, desc = imp.find_module('signal', sys.path)
if f:
    f.close()
    signal = imp.new_module('signal')
    execfile(path, signal.__dict__)
else:
    raise ImportError('signal.py not found')
# signal is your module

此代码段与导入信号大致相同,只是它不会将找到的模块插入到sys.modules中,并且在搜索路径之前不会查找内置模块.

标签:python,python-2-4
来源: https://codeday.me/bug/20190521/1146952.html