当前位置: 首页 > 面试题库 >

导入python模块而不实际执行

黄流觞
2023-03-14
问题内容

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

def init():
    blah

def execute():
    more blah

def cleanup():
    yadda

所以我只是

import imp
fname, path, desc = imp.find_module(userscript)
foo = imp.load_module(userscript, fname, path, desc)
foo.init()

然而,大家都知道,用户的脚本 执行 尽快load_module运行。这意味着脚本可以是这样的:

def init():
    blah

yadda

脚本yaddaimport经产生就被调用。

我需要的是一种方法:

  1. 首先检查它是否具有init(),execute()和cleanup()
  2. 如果它们存在,一切都会很好
  3. 如果不存在,抱怨
  4. 不要运行任何其他代码,或者至少不要运行,直到我知道没有init()

通常,我会强迫使用相同的旧if __name__ == '__main__'技巧,但是我对用户提供的脚本几乎没有控制权,因此我正在寻找相对轻松的解决方案。我已经看到了各种复杂的技巧,包括解析脚本,但是没有什么真的很简单。我很惊讶它不存在..或者也许我没有得到任何东西。

谢谢。


问题答案:

我尝试使用ast模块:

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!")


 类似资料:
  • 我需要在Python中导入一个名为array_queue的模块。我检查了一下,如果我不使用它,就会出现一个提示:“array_queue imported but unused”。但是,如果我使用它并运行该程序,则会出现以下情况: ModuleNotFounderRror:没有名为“array_queue”的模块

  • 我正在用Python开发一个包。我使用虚拟环境。我在我的虚拟环境中的. pth路径中设置了模块的根路径,这样我就可以在开发代码和进行测试的同时导入包的模块(问题1:这是一个好方法吗?)。这工作正常(这里有一个例子,这是我想要的行为): 但是,如果我尝试使用PyTest,则会收到一些导入错误消息: 我有点困惑,看起来这表明了一个导入错误,但是Python做得很好,那么为什么PyTest会有问题呢?对

  • 我想对GitHub上的一个公共项目做些改变(如果有好处的话,可能会有所贡献)。我已经分支并克隆了模块,但我不清楚如何让我的程序导入本地库,而不是“官方”安装的模块。 我尝试将它克隆到我的项目文件夹中,但是当我导入它并尝试使用它时,事情变得很奇怪 我还尝试了做<code>sys.path。附加和文件夹位置。但它似乎仍然进口官方的,而不是分叉的。 我假设我可以把我的程序放在模块文件夹中,这样模块会先被

  • 主要内容:import 模块名 as 别名,from  模块名 import 成员名 as 别名使Python 进行编程时,有些功能没必须自己实现,可以借助 Python 现有的标准库或者其他人提供的第三方库。比如说,在前面章节中,我们使用了一些数学函数,例如余弦函数 cos()、绝对值函数 fabs() 等,它们位于 Python 标准库中的 math(或 cmath)模块中,只需要将此模块导入到当前程序,就可以直接拿来用。 前面章节中,已经看到使用 import 导入模块的语法,但实际上

  • 3.3 Python模块导入 与C++类似的,在Python中导入其他模块时,也需要相关处理。 需求:首先新建一个Python文件A,再创建Python文件UseA,在UseA中导入A并调用A的实现。 实现: 新建两个Python文件,使用 import 实现导入关系; 添加可执行权限、编辑配置文件并执行UseA。 1.新建两个Python文件并使用import导入 文件A实现(包含一个变量):

  • 问题内容: 我已尝试找到有关最佳使用还是全面的指南。我刚开始使用Python,并且正在尝试着眼于最佳实践。 基本上,我希望有人能分享他们的经验,其他开发人员有什么喜好,以及避免遇到麻烦的最佳方法是什么? 问题答案: 和之间的区别主要是主观的。选择最喜欢的一个,并在使用中保持一致。这里有一些要点可以帮助你做出决定。 优点: - 减少维护你的import报表。无需添加任何其他导入即可开始使用模块中的另