问题:是否可以将python对象反向工程为字符串?
信息:我现在正在开展一个项目,将我的教授的研究分布在几十台计算机而不仅仅是他的计算机上。作为一名优秀的程序员,我正在制作一个通用程序,不仅可以用于他的特定程序。因此,将运行其代码的计算机不会,也不会有他的.py文件供他们导入。我过去解决这个问题的方法是他只需将所有内容放在一个文件中,然后将该文件的路径传递给我的系统,然后将该代码作为字符串从其状态导入(使用从中收集的信息) this问题)。
但这让我很奇怪。我现在可以从一个字符串导入并让代码执行正常和花花公子。这一切都很好,但它让我想到,有没有办法让我不得不让他把他的代码文件传递给我?特别是我想知道这样的事情。说他在他的文件中有所有这些:
def hello():
print "Hello world!"
导入此文件时,“hello”将添加到全局命名空间。但现在我想通过网络传输它。你不能打电话给“你好”,并让它工作,我试过,挑选出正确的拒绝。
另一方面,我让节点计算机使用“newMod中的exec代码。 dict ”来创建代码。所以,如果我可以采取“你好”并推动它通过一些函数返回给我“def hello():\ n print \”Hello world!\“”以便我的exec方法可以运行。我会是金色的。我可以做到这一点,因此他可以拥有的不仅仅是一个档案,因为我可以对他所拥有的任何非标准进口进行逆向工程。
老实说,我希望答案是否定的,但我认为值得一试。再简单地说,我想要一个已导入的模块并将其转换为字符串。
答案 0 :(得分:1)
虽然这不是一个好方法,但你只能从函数中挑选__code__
...
>>> def foo():
... print "Hello"
>>> import pickle
>>> code = pickle.dumps(foo.__code__)
>>> def bar():
... pass
>>> bar()
>>> bar.__code__ = pickle.loads(code)
>>> bar()
Hello
答案 1 :(得分:0)
使用marshal module,您可以来回保留代码对象:
>>> source = """
... def hello():
... print "Hello, world!"
... """
>>>
>>> code = compile(source, '<mycustomcode>', 'exec')
>>> class Module(object): pass
...
>>> module = Module()
>>> exec code in module.__dict__
>>> module.hello()
Hello, world!
>>> import marshal
>>> marshal.dumps(code)
'c\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00@\x00\x00\x00s\r\x00\x00\x00d\
x00\x00\x84\x00\x00Z\x00\x00d\x01\x00S(\x02\x00\x00\x00c\x00\x00\x00\x00\x00\x00
\x00\x00\x01\x00\x00\x00C\x00\x00\x00s\t\x00\x00\x00d\x01\x00GHd\x00\x00S(\x02\x
00\x00\x00Ns\r\x00\x00\x00Hello, world!(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x
00\x00\x00(\x00\x00\x00\x00s\x0e\x00\x00\x00<mycustomcode>t\x05\x00\x00\x00hello
\x02\x00\x00\x00s\x02\x00\x00\x00\x00\x01N(\x01\x00\x00\x00R\x00\x00\x00\x00(\x0
0\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00s\x0e\x00\x00\x00<mycustomcode>t\
x08\x00\x00\x00<module>\x02\x00\x00\x00s\x00\x00\x00\x00'
不确定这是不是一个好方法......