Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何导入python模块而不实际执行它?

如何导入python模块而不实际执行它?

提问于 2018-02-27 20:56:18
回答 2关注 0查看 467

在复杂应用程序的上下文中,我需要导入用户提供的“脚本”。理想情况下,脚本应该有

代码语言:txt
AI代码解释
复制
def init():
    blah

def execute():
    more blah

def cleanup():
    yadda

所以我只想

代码语言:txt
AI代码解释
复制
import imp
fname, path, desc = imp.find_module(userscript)
foo = imp.load_module(userscript, fname, path, desc)
foo.init()

但是用户的脚本是执行只要load_module。也就是说,脚本可以是这样的:

代码语言:txt
AI代码解释
复制
def init():
    blah

yadda

我需要:

  1. 首先检查它是否有init()、EXECUTE()和CLEAUP()
  2. 如果存在,一切正常。
  3. 如果不存在,反馈。
  4. 不要运行任何其他代码,或者至少在我知道没有init()之前不要运行。

回答 2

Dust

回答已采纳

发布于 2018-02-28 05:15:28

我尝试使用ast模块:

代码语言:txt
AI代码解释
复制
import ast

# which syntax elements are allowed at module level?
whitelist = [
  # docstring
  lambda x: isinstance(x, ast.Expr) \
             and isinstance(x.value, ast.Str),
  # import
  lambda x: isinstance(x, ast.Import),
  # class
  lambda x: isinstance(x, ast.ClassDef),
  # function
  lambda x: isinstance(x, ast.FunctionDef),
]

def validate(source, required_functions):
  tree = ast.parse(source)

  functions = set()
  required_functions = set(required_functions)

  for item in tree.body:
    if isinstance(item, ast.FunctionDef):
      functions.add(item.name)
      continue

    if all(not checker(item) for checker in whitelist):
      return False

  # at least the required functions must be there
  return len(required_functions - functions) == 0


if __name__ == "__main__":
  required_funcs = [ "init", "execute", "cleanup" ]
  with open("/tmp/test.py", "rb") as f:
    print("yay!" if validate(f.read(), required_funcs) else "d'oh!")

好好看解密

发布于 2018-02-28 06:35:50

下面是AST方法的一个更简单的替代方案:

代码语言:txt
AI代码解释
复制
import sys
from imp import find_module, new_module, PY_SOURCE


EXPECTED = ("init", "execute", "cleanup")

def import_script(name):
    fileobj, path, description = find_module(name)

    if description[2] != PY_SOURCE:
        raise ImportError("no source file found")

    code = compile(fileobj.read(), path, "exec")

    expected = list(EXPECTED)
    for const in code.co_consts:
        if isinstance(const, type(code)) and const.co_name in expected:
            expected.remove(const.co_name)
    if expected:
        raise ImportError("missing expected function: {}".format(expected))

    module = new_module(name)
    exec(code, module.__dict__)
    sys.modules[name] = module
    return module

请记住,这是一种非常直接的方法,可以绕过Python导入机器的扩展。

和开发者交流更多问题细节吧,去 写回答
相关文章
【Python模块】- 如何导入和使用模块?模块导入方式有哪些?
首先先准备两个模块,md_01_测试模块1和 md_02_测试模块2,然后在demo文件中导入模块并使用工具。
python自学网
2022/10/05
3.4K0
【Python模块】- 如何导入和使用模块?模块导入方式有哪些?
【Python】模块导入 ① ( Python 模块简介 | 模块概念 | 模块作用 | 模块特点 | 常见的 Python 模块 | Python 模块导入 | Python 模块导入语法 )
Python 模块 就是一个以 .py 为后缀的 Python 代码文件 , 在模块中定义有 :
韩曙亮
2023/10/11
3890
【Python】模块导入 ② ( 模块导入语法 | 导入完整模块 | import 导入完整模块 | from 导入完整模块 )
该方法用于 导入完整的模块 , 包括模块中的 函数 / 变量 / 类 / 代码块 等 ;
韩曙亮
2023/10/11
2970
【Python】模块导入 ② ( 模块导入语法 | 导入完整模块 | import 导入完整模块 | from 导入完整模块 )
python模块导入
[seemmo@RegionServer1 duwen]$ python Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information.
py3study
2020/01/14
1.6K0
Python 导入模块
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Python 导入模块 更多内容请见👇 Python 入门基础专栏 Python 字符串 Python 常用字符串方法 ---- Python 导入模块 1.import 模块名 2.import 模块名 as 名称缩写 3.import 模块名.子模块名 as 名称缩写 4.from 模块名 import 函
小嗷犬
2022/11/15
1.4K0
pycharm导入pandas模块_pycharm如何导入python的库
网上有些反应安装pandas库时会出现问题,提示好像是pip的原因。 这时候大概是自己的pip版本太久啦。所以最好先在cmd更新一下pip好了。
全栈程序员站长
2022/09/26
3.2K0
pycharm导入pandas模块_pycharm如何导入python的库
轻松导入和执行Python模块的3种技巧
作为一名程序员,你肯定希望与团队其他用户共享你所创建的有用模块。尽管你的模块可能有用,但是如果其他人需要花费大量精力来访问模块中的有用功能,则其他人将不会使用它。
AI算法与图像处理
2021/03/14
8930
【Python】模块导入 ⑤ ( 主程序判断语句 | 模块中执行函数问题 | 制作自定义模块并执行函数 | 导入自定义模块会执行模块中的代码 )
执行上述代码 , 结果如下 , 没有调用 my_module 模块中的函数 , 但是该函数还是触发了 ;
韩曙亮
2023/10/11
2860
【Python】模块导入 ⑤ ( 主程序判断语句 | 模块中执行函数问题 | 制作自定义模块并执行函数 | 导入自定义模块会执行模块中的代码 )
pycharm如何导入自定义模块_Python添加模块
问题:明明python已经安装模块,但是在pycharm打开的项目中,导入改模块,却提示找不到改模块
全栈程序员站长
2022/09/28
2K0
pycharm如何导入自定义模块_Python添加模块
【Python】模块导入 ③ ( 模块导入语法 | from 导入部分模块功能 | 为导入的模块设置别名 | import 导入模块设置别名 | from 导入模块设置别名 )
在导入模块时 , 有时不需要使用模块的完整功能 , 只需要导入指定的部分功能即可 , 这样也符合最少知识设计原则 ;
韩曙亮
2023/10/11
4420
【Python】模块导入 ③ ( 模块导入语法 | from 导入部分模块功能 | 为导入的模块设置别名 | import 导入模块设置别名 | from 导入模块设置别名 )
1 - 导入python 模块
1. 导入python 模块的基本方式 2. 为导入的python 模块指定别名 import math from math import cos, tan from math import * print(math.sin(1.23)) print(cos(2.34)) print(tanh(1.23)) # 指定别名 as # 一旦指定了别名,原来的名字就不能用了 import math as mt print(mt.sin(2)) from math import cos as cs print
ruochen
2021/05/22
1.3K0
1 - 导入python 模块
python 模块导入问题
在python中,模块导入和编码都是比较重要的,这两种东西一定要花时间弄清楚,如果摸棱两可,每次出问题都靠猜,那是非常痛苦的。
叶子陪你玩
2022/05/22
1.8K0
python 模块导入问题
python模块导入细节
官方手册:https://docs.python.org/3/tutorial/modules.html
py3study
2020/01/18
2K0
【Python】模块导入 ⑥ ( `__all__` 变量简介 | `__all__` 变量用法 | import 导入整个模块 - 执行阶段报错 | from 导入整个模块 - 编译阶段报错 )
Python 语言中的 __all__ 变量 是一个 列表 数据容器 , 用于控制 本应用 导入的 模块 中 可以使用 导入模块 的哪些 变量 / 函数 / 类 ;
韩曙亮
2023/10/11
5170
【Python】模块导入 ⑥ ( `__all__` 变量简介 | `__all__` 变量用法 | import 导入整个模块 - 执行阶段报错 | from 导入整个模块 - 编译阶段报错 )
pycharm导入自定义模块_模块导入速度python
Pycharm是很多Python开发者的首选IDE,如果能把一个工具熟练运用,往往有事半功倍的效果,各种快捷键、重构功能、调试技巧。由于Python是一门动态语言,对于自动导入包模块没有静态语言那么方便,但是我们有了Pycharm,还是可以很强大的。
全栈程序员站长
2022/09/27
1.4K0
pycharm导入自定义模块_模块导入速度python
【说站】python如何导入模块的特定函数
1、可以导入模块中的特定函数: from pygame import make_bullet。
很酷的站长
2022/11/24
2K0
【说站】python如何导入模块的特定函数
如何动态导入ECMAScript模块
ECMAScript(又名ES2015或ES)模块是在JavaScript中组织内聚代码块的一种方法。
前端小智@大迁世界
2022/05/18
1.2K0
python动态导入库模块
最近在实现一个基于深度学习的数据扩增方法,为了测试多种方法,需要一个框架型的程序动态调用model。在这种需求下,框架代码就需要动态扫描models目录下的所有模型,并动态导入。
羽翰尘
2019/11/20
2.5K0
Python导入模块的方法
Python导入模块的方法有两种:import module 和 from module import a,区别是前者所有导入的东西使用时需加上模块名的限定(module.a),而后者不需要。
py3study
2020/01/17
1.6K0
Pycharm 导入 Python 包、模块
1.点击 File->settings 2.选择 Project Interpreter,点击右边绿色的加号添加包 3.输入你想添加的包名,点击 Install Package 4.可以在 Pycharm 保存项目的目录下查看已经安装的包,路径 D:\PycharmProjects\untitled\venv\Lib\site-packages
用户1685462
2021/07/26
2.1K0

相似问题

Python中的动态模块导入?

2439

Java在导入模块时找不模块,(初学者)如何解决?

066

如何在Python中导入其他文件?

2667

如何导入一个模块给定的完整路径?

2656

如何在Python中进行相对导入?

2288
相关问答用户
腾讯云TDP | TDP会员擅长3个领域
平安资管 | 架构师擅长4个领域
擅长3个领域
擅长5个领域
腾讯云TDP | KOL擅长5个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档