修复python的坏的行为的例程。

demain的Python项目详细描述


这个包为您想要的情况提供了一个干净的解决方案 编写一个可以从命令行安全调用的python模块 但也需要其他模块导入。简单地写下每一个 通常会生成__name__==^{tt3}的模块$ 改为这样检查:

'Your module docstring'

import demain
__main__ = demain.fix()

# Your other import statements
# Your classes and functions

if __main__:
    # Your code that gets invoked from the command line

如果您的模块只是被另一个模块导入, 函数fix()什么也不做,返回False。但是如果你的 模块已被直接调用,可以作为脚本调用,也可以使用python的 -m选项,然后fix()将:

  • 用模块的真实名称替换模块的__name__全局变量。
  • sys.modules中以模块的真名重新注册模块,以便 稍后其他python模块的import语句可以找到它。
  • 如果模块位于包的下面,则将模块插入 以其正确名称命名的包。
  • 在进行这些更正之后,函数返回True,以便 您的模块可以检测到它作为主程序运行。

我主张未来版本的python停止破坏模块名 在每个模块中设置一个__main__boolean 德马因确实如此。但在此之前,请使用demain将您的程序 一些理智,安全,少一些神秘的中断和错误信息。

背景

从命令行运行python脚本或调用模块时 使用-m选项,python为该脚本或模块提供假 名称'__main__',以便它能够检测到它作为 “main program.”考虑一个小脚本,如下所示:

# foo.py
print __name__

从命令行调用它会删除正常的fooname 如果不是这样的话(我们可以证明,通过导入 命令行中的模块):

$ python foo.py
__main__
$ python -m foo
__main__
$ python -c 'import foo'
foo

此名称损坏在与 它们本身就是进口的目标,因为 以实名导入模块会导致 正在创建模块,每个对象和类都有自己的副本。这个 这导致的漏洞往往特别难以追踪。

demain.fix()函数的设计目的是防止此问题 即使是一开始,你第一次打电话给 要直接调用的每个模块。小心不要 只是为了避免在运行fix()之前执行其他导入,但是 还要确保首先不创建类;否则,名称 '__main__'将作为其模块名复制到您的类中。

我知道当我读到 保护金字塔的设计,并达到克里斯·麦克唐纳的痛苦 在标题为“应用程序程序员不能控制 模块范围代码路径。“

http://docs.pylonshq.com/pyramid/dev/designdefense.html

在那里,他对python的长期经验和他经过严格磨练的编码 实践使他对 小python应用程序——特别是那些 使用web微框架-当他们将脚本视为 是一个正常的模块。我希望demain能解决这个问题 使调用的python脚本成为对象的安全位置, 而不是在同一个python文件 使用普通导入从应用程序中的其他位置导入。

这个包附带了一个适度的测试套件,它是由几个手工构建的 示例,以及McDonough的示例decorator框架 python处理脚本调用的问题。运行它, 只需键入:

$ python -m demain.tests

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java找不到当前线程的会话   同步Java同步方法调用非同步方法   这段代码的java时间复杂度是如何列出一个集合的所有子集的?   java Jetty SslConnectionFactory nextProtocol   为什么在java集合中使用游标而不是for循环   java如何对长函数进行单元测试?   如何从java中的文本输入创建数组   java工具栏内容未显示,尽管出现了片段内容   java MediaPlayer无法处理本地文件   java在多次读取时,从TCP服务器读取的数据将挂起   java组织。springframework。数据领域无法将PageImpl强制转换为   java如何使用@WithMockUser并从属性文件中传递用户名和密码?   JavaSpringBootGradle插件2。x如何使用自定义启动器布局工厂   sockets Java客户端和服务器之间使用字符串等进行通信的“行业标准”方法是什么   java变量引用不存在的资源:${project\u loc:project\u name}   搜索如何返回LDAP Java中所有用户的特定属性?   JDK1.8.016x的java密钥斗篷代理问题   spring如何使用Java中的Exchange获取邮件   java Kotlin+Dagger 2:Dagger*文件不会生成   如何在传入的double上执行操作,然后在Java中返回