Python:导入模块而不执行脚本

时间:2013-04-23 19:05:14

标签: python import

我查看了一个similar问题,但它并没有真正回答我的问题。假设我有以下代码(过于简化以仅突出显示我的问题)。

class A:
    def __init__(self,x):
        self.val = x

a = A(4)
print a.val

此代码位于文件someones_class.py中。我现在想要在我的程序中导入并使用类A,而无需修改 someones_class.py。如果我from someones_class import A,python仍然会执行文件中的脚本行。

问题:有没有办法只导入类A而不执行最后两行?

我知道if __name__ == '__main__'的事情,但我没有选择修改someones_class.py文件,因为只有在我的程序开始执行后才能获得它。

3 个答案:

答案 0 :(得分:7)

这个答案只是为了证明可以完成,但显然需要一个更好的解决方案来确保您包含要包含的类。

>>> code = ast.parse(open("someones_class.py").read())
>>> code.body.pop(1)
<_ast.Assign object at 0x108c82450>
>>> code.body.pop(1)
<_ast.Print object at 0x108c82590>
>>> eval(compile(code, '', 'exec'))
>>> test = A(4)
>>> test
<__main__.A instance at 0x108c7df80>

您可以检查code正文以查找要包含的元素,然后删除其余部分。

注意:这是一个巨大的黑客攻击。

答案 1 :(得分:1)

不,没有办法防止这些额外的行被执行。您可以做的最好的事情是阅读脚本并解析出类 - 使用它来创建您想要的类。

这可能比您想做的工作更多,但是,对于意志坚定的人来说,ast模块可能会有所帮助。

答案 2 :(得分:1)

不,没有办法。至少并非没有极端的诡计......也就是说,如果你愿意破解一些奇怪的“解决方案”,几乎所有东西都可以在Python中使用。

“someones_class.py”来自哪里?你为什么不能改变它?我的意思是,编辑文件,而不是从代码中更改它。你能告诉写这篇文章的人不要在顶级编写排序测试代码吗?

这里隐藏着一个有趣的(有点重要的)关于Python的课程:“A类:”不是声明。它实际上是Python解释器在加载文件时执行的代码。