【问题标题】:How to execute compiled python code如何执行编译的python代码
【发布时间】:2015-08-27 21:31:10
【问题描述】:

我有一个编译好的 Python 文件,path/program.pyc

我想用我当前的globals()locals() 执行它。我试过了:

with open('path/program.pyc','rb') as f:
   code = f.read()
   exec(code, globals(), locals())

更具体地说,我想要的是:

a.py

a = 1
# somehow run b.pyc

b.py

print(a)

当我运行a.py 时,我想查看输出:1

实际上execfile() 完全符合我的要求,但它只适用于.py 文件而不是.pyc 文件。我正在寻找适用于.pyc 文件的execfile() 版本。

【问题讨论】:

  • 你想在 a 中运行 b 的代码吗?
  • @PadraicCunningham 是的,但我只有b.pyc 而不是b.py
  • 一个简单的方法是解压缩 pyc,因为小文件需要很少的开销。 github.com/wibiti/uncompyle2
  • @PadraicCunningham 我明白了。谢谢。但是,如果您无法立即使用.pyc 而无需解压缩,这不是也让您感到不安吗? Python 应该让事情变得更容易,而不是更难。对吗?
  • 我想这是因为从源代码到字节码比从字节码到源代码要容易得多,尽管这并不是说它不能完成,我只是想到 uncompyle 当我看到这个问题,我用过很多次了,一直都很好用。

标签: python pyc


【解决方案1】:

可能有更好的方法,但使用uncompyle2 获取源并执行将满足您的需要:

a = 1

import uncompyle2
from StringIO import StringIO
f = StringIO()
uncompyle2.uncompyle_file('path/program.pyc', f)
f.seek(0)
exec(f.read(), globals(), locals())

a 运行b.pyc 应该输出1

【讨论】:

    【解决方案2】:

    使用__import__

    请注意,您需要使用标准 python 包符号而不是路径,并且您需要确保您的文件位于 sys.path

    __import__('path.program', globals(), locals()) 之类的东西应该可以解决问题。

    【讨论】:

    • 嘿,谢谢你的回答,但我无法让它工作。我用详细信息更新了我的问题。
    • 当你导入一个 python 包时,你不要把'.py'放在最后。再看我的例子,没有'.pyc'
    • 你看我说的了吗?完全离开它。 __import__('b', globals(), locals())
    • 同样的错误。你能在你的回答中举个例子吗?
    猜你喜欢
    • 2021-12-02
    • 2015-03-14
    • 2022-07-13
    • 2014-11-28
    • 2021-01-02
    • 2012-04-28
    • 2022-07-15
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多