V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
black11black
V2EX  ›  问与答

Python 有办法“安全地”import 别人提供的包吗

  •  
  •   black11black · 2020-02-12 07:15:58 +08:00 · 1155 次点击
    这是一个创建于 1746 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题, 标题里所谓“安全地”指的是在载入阶段不运行任何用户级代码,只做单纯的载入。

    比如我们写包的时候经常会把除了 class 和 def 外的其他部分,用if __name__ == '__main__':包裹起来,做的就是这种工作。让我们只是单纯地执行 import,而后续的工作可以在 import 后根据已经导入的实际情况分析判断之后再做决定。。

    这个问题可能面对的情况有两种,其一是我设计框架开放了一个插槽,允许用户插入自定义脚本。那么我希望在导入阶段并不会直接开始“因为某些用户书写脚本的疏漏”,而直接开始运行某几句代码,以避免发生任何不可控的问题。

    另一个情况比如说我们从网上下载开源库,虽然 pypi 不像 npm 那样发展到遍地病毒的程度,但是毕竟也允许上传自定义二进制文件。。。所以出于安全考量我们希望只是单纯地引入 class 和 function,不执行任何一句代码。

    ====================

    总之,有比较优雅的方式实现吗?

    ==================== 我能想到的比较丑陋的办法就是自己实现一个简单的解释器,读入库文本进行预 parsing,但是怎么想都感觉很蛋疼。

    4 条回复    2020-02-12 08:49:53 +08:00
    Trim21
        1
    Trim21  
       2020-02-12 07:19:17 +08:00 via Android
    然后别人在类的定义内部下毒,你这办法还是绕不过去
    crella
        2
    crella  
       2020-02-12 07:43:48 +08:00 via Android
    这个好像还真没什么办法
    Cbdy
        3
    Cbdy  
       2020-02-12 08:00:49 +08:00
    没有办法,全靠自觉
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1045 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:30 · PVG 03:30 · LAX 11:30 · JFK 14:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.