- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
imp.find_module()没有从压缩的鸡蛋中找到模块。
如何找到可以来自两个地方的模块:目录或压缩的鸡蛋?在我的例子中,重要的是我可以提供一个 path
参数,比如 imp.find_module() 支持它。
背景
不知何故,包在我们的环境中安装了两次。作为压缩鸡蛋和普通文件。我想写一个检查,告诉我一个模块是否安装了两次。参见 https://stackoverflow.com/a/23990989/633961
最佳答案
假设使用 Python 2,我认为您需要的信息在 PEP 302 - New Import Hooks 中(PEP 对于 Python 3 已经过时,在这方面完全不同)。
从 ZIP 文件中查找和导入模块在 zipimport 中实现,如 PEP 所述,它被“ Hook ”到进口机器中。当 PEP 302 和从 ZIP 导入被添加到 Python 时,imp
模块没有被改编,即 imp
完全不知道 PEP 302 钩子(Hook)。
一个“通用”find_module
函数可以找到像 imp
这样的模块并且尊重 PEP 302 钩子(Hook),大致如下所示:
import imp
import sys
def find_module(fullname, path=None):
try:
# 1. Try imp.find_module(), which searches sys.path, but does
# not respect PEP 302 import hooks.
result = imp.find_module(fullname, path)
if result:
return result
except ImportError:
pass
if path is None:
path = sys.path
for item in path:
# 2. Scan path for import hooks. sys.path_importer_cache maps
# path items to optional "importer" objects, that implement
# find_module() etc. Note that path must be a subset of
# sys.path for this to work.
importer = sys.path_importer_cache.get(item)
if importer:
try:
result = importer.find_module(fullname, [item])
if result:
return result
except ImportError:
pass
raise ImportError("%s not found" % fullname)
if __name__ == "__main__":
# Provide a simple CLI for `find_module` above.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-p", "--path", action="append")
parser.add_argument("modname", nargs='+')
args = parser.parse_args()
for name in args.modname:
print find_module(name, args.path)
但请注意,在 ZIP 存档中查找模块的结果看起来与 imp.find_module
返回的结果完全不同:您将得到一个 zipimport.zipimporter
特定 ZIP 的对象。上面的小程序在被要求查找常规模块、内置模块和压缩鸡蛋中的模块时打印以下内容:
$ python find_module.py grin os sys
<zipimporter object "<my venv>/lib/python2.7/site-packages/grin-1.2.1-py2.7.egg">
(<open file '<my venv>/lib/python2.7/os.py', mode 'U' at 0x10a0bbf60>, '<my venv>/lib/python2.7/os.py', ('.py', 'U', 1))
(None, 'sys', ('', '', 6))
关于python - imp.find_module() 支持压缩鸡蛋,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28962344/
例如: import subprocess p=subprocess.Popen("imp -help",stdout=subprocess.PIPE,stdin=subprocess.PIPE) o
我最近开始使用导入来更好地组织我在 python 中的代码。我在 file1.py 中的原始代码使用了以下行: def foo(): files = [f for f in os.listdi
根据imp.load_module文档,“调用方负责关闭文件参数”。“如果我将从imp.find_module返回到imp.load_module的文件对象,我仍然负责关闭文件对象吗?”或者帮我关上它
这个问题在这里已经有了答案: How to ignore deprecation warnings in Python (17 个答案) 关闭 4 年前。 每当我尝试在 PyCharm 中使用“sk
我使用的是python2.5。我需要动态导入一个模块,然后在更改时重新加载。我如何实现这一目标。 我在下面的示例中尝试过 - 不起作用: import imp modfile = 'mymod_inf
我的应用程序具有以下布局: /wsgi/myapp/__init__.py /wsgi/application /app.py 文件_init_.py: from flask import Flask
对于某些Python项目,我在config模块中定义了默认配置。可以通过使用 rc 文件来进行定制 config = imp.load_source('config', 'some_rc_file')
我的一些程序运行没有问题,但我仍然收到以下错误代码。它对程序本身没有影响,但我仍然想解决它。 C:\Program Files\JetBrains\PyCharm Community Edition
我有一个执行以下操作的脚本: import imp imp.load_source("storage_configuration_reader","/bi/opt/RNAspace/rnaspace_
我只是在插入数组时遇到了麻烦...让子项从根或“父项”分支出来。 我一直在尝试将数据插入到基于数组的 BST 实现中: BST::BST(int capacity) : items(new item[
我设置了一个类,理想情况下它将读取传入的任何类的方法,然后在运行时将它们全部映射到单个选择器,然后再将它们转发到它们的原始选择器。 这现在确实有效,但我一次只能对一种方法执行此操作。问题似乎是,一旦我
是否可以创建一个 IMP,其中参数的数量与正在解析的实例方法的选择器相匹配? 我可以使用“if”语句和有限数量的参数(比如 0 到 10 之间),但是是否可以使用带有 va_args 的 IMP_im
imp.find_module()没有从压缩的鸡蛋中找到模块。 如何找到可以来自两个地方的模块:目录或压缩的鸡蛋?在我的例子中,重要的是我可以提供一个 path 参数,比如 imp.find_modu
背景 当您使用命名空间包并将代码库划分到单独的文件夹中时,pylint 无法导入文件的问题让我感到厌烦。因此,我开始深入研究 astNG 源代码,它已被确定为问题的根源(请参阅 astng 上的错误报
我正在阅读 this所以关于从绝对路径导入模块的问题。一个答案建议使用以下代码: import imp foo = imp.load_source('module.name', '/path/to/f
我正在尝试从不同的目录动态导入模块。我正在关注 this question 的回答.我在名为 foo 的目录中有一个名为 bar 的模块。主脚本将在 foo 的父目录中运行。 这是我目前在测试脚本中的
Imp 运算符 对两个表达式进行逻辑蕴涵运算。 result = expression1 Imp expression2 参数 result 任意数值变量。 expression1 任
通常,当我必须在 unix 上备份数据库时,我会这样做, exp DBUSER/DBPSW@INST file=xxx.dmp 或从转储加载 imp DBUSER/DBPSW@INST file=xx
我正在编写一些数据传输例程的脚本,并将 exp 和 imp 合并到工作流程中。这两个都有一个 FILE= 参数来指定数据文件。 有没有办法指定标准输入和标准输出?我很想做这样的事情: exp ...
我可以通过以下方式获取方法的实现: IMP imp = [self methodForSelector:@selector(foo)]; 我知道 IMP 基本上是一个函数指针。 然后我可以得到指向的代
我是一名优秀的程序员,十分优秀!