gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:03:59 25 4
gpt4 key购买 nike

我有一个正在编写的 python 包,但由于名称冲突,我遇到了一个问题,即导入的是标准库而不是我的文件。

例如,文件结构如下:

package/__init__.py

# No data in this file

包/模块.py

#!/usr/bin/env python
print 'Loading module.py'
import 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 时,它的 import signal 转到 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 中的打印语句没有被触发。这意味着加载的信号是来自标准库的信号。

最佳答案

这种情况下的问题在于,内置的signal 模块是作为解释器启动过程的一部分导入的。因此,当您在 module.py 中的代码运行时,已经 sys.modules 中名为 signal< 的条目,以内置模块作为其值。由于 sys.modulesimport 语句查找的第一个位置,它将返回内置模块并停在那里。它甚至不用费心去寻找您自己的自定义 signal.py

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

  1. 重命名您的模块。这是最简单的解决方案。您不必担心您的模块名称与已安装的包 (eggs) 冲突,因为 通常 import 语句将按照 sys 指定的顺序搜索目录.path,运行解释器时的当前工作目录位于该列表的第一位。 signal 是一种特殊情况,因为它会在您的代码运行之前自动导入,但只有有限数量的模块是正确的,而且这些是您唯一必须避免名称冲突的模块与。
  2. 您可以del sys.modules['signal'] 并将条目替换为您自己的自定义signal 模块。 实际上不要这样做,除非您的模块确实是内置 signal 的直接替代品。如果你这样做,那么从那时起运行 import signal 的任何代码都将获得 你的 版本,而不是内置版本,这可能会对任何内部代码造成严重破坏需要 signal 模块才能运行。
  3. 您可以使用 imp module访问 import 函数的内部结构,或者至少是等效代码,这将允许您绕过 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

    这段代码大致等同于import signal,只是它没有将找到的模块插入到sys.modules中,并且在搜索之前没有寻找内置模块路径。

关于Python 导入被标准库覆盖 (Python 2.4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8556514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com