2013-11-28 39 views
0

比如我可以做這樣的事情是否有一個python函數來爲python代碼字符串生成字節碼?

pythonCode = "print 'hello world'" 
pyc = generate_bytecode(pythonCode) 

其中PYC將包含Python代碼的字節碼?

編輯:我的目標主要是準確地得到將寫入到一個.pyc文件中的變量。神奇的數字,時間戳的十六進制代碼版本和所有

+0

請問您的用例是什麼? –

+0

我注意到在python文件中使用python 2.7.5字節碼中的空格並不重要,而且您可以直接在.pyc文件上調用python。我想爲使用生成的字節碼的Python代碼編寫混淆器 – imkendal

+0

不是出於安全原因,僅僅因爲我很無聊,這聽起來像是有趣的事 – imkendal

回答

1

使用compiler包:

compiler包是一個Python源成字節碼用Python編寫的翻譯。它使用內置的解析器和標準的parser模塊來生成具體的語法樹。該樹用於生成抽象語法樹(AST),然後生成Python字節碼。

+0

我已經解決了從編譯器包中使用compileFile方法到生成pyc文件並將其讀回到內存中,而不是使用實際的compile.compile命令,因爲更難以弄清楚如何使用後一種方法獲取完全生成的pyc文件。因爲這個答案只是推薦編譯器包,這將是我接受的答案。謝謝所有回答。所有評論和迴應都很有幫助。 – imkendal

2

這就是所謂compile

>>> compile('print "Hi!"', 'abc', 'single') 
<code object <module> at 0000000002555D30, file "abc", line 1> 
>>> eval(compile('print "Hi!"', 'abc', 'single')) 
Hi! 
2

傳遞'exec'modecompile()將產生從Python語句代碼對象。訪問代碼對象的co_code屬性將爲您提供原始字節碼。請注意,如果沒有其他co_*屬性,這本身就是無用的。

>>> c = compile('print a', '<string>', 'exec') 
>>> dir(c) 
['__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames'] 
>>> c.co_code 
'e\x00\x00GHd\x00\x00S' 
>>> c.co_names 
('a',) 
>>> c.co_consts 
(None,) 
>>> dis.dis(c) 
    1   0 LOAD_NAME    0 (a) 
       3 PRINT_ITEM   
       4 PRINT_NEWLINE  
       5 LOAD_CONST    0 (None) 
       8 RETURN_VALUE