2017-09-19 4 views
0

Je travaille avec de grandes chaînes de chiffres, les gens dont vous pouvez voir ici:Prenez la sortie de la console à partir d'un appel subprocess Python et de métamorphose dans CSV valide (et/ou JSON)

6060604052361561006c5760e060020a60003504630121b93f81146100e15780636637b882146101615780636dbf2fa0146101935780638da5cb5b1461026a578063a6f9dae11461027c578063beabacc8146102ae578063d979f5aa14610322578063e1fa763814610354575b61050b600060006000600460005054111561051d576004805460001901905560015460035460055460e260020a6320998771026060908152606492909252600160a060020a03908116608452909116906382661dc49060a49060209060448187876161da5a03f11561000257506105c3915050565b6105cb60043560005433600160a060020a039081169116141561015e57600180547fc9d27afe0000000000000000000000000000000000000000000000000000000060609081526064849052608492909252600160a060020a03169063c9d27afe9060a4906020906044816000876161da5a03f115610002575050505b50565b6105cb60043560005433600160a060020a039081169116141561015e5760018054600160a060020a0319168217905550565b60806020604435600481810135601f8101849004909302840160405260608381526105cb9482359460248035956064949391019190819083828082843750949650505050505050600054600160a060020a039081163390911614156102655782600160a060020a03168282604051808280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f16801561024b5780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876185025a03f1505050505b505050565b6105cd600054600160a060020a031681565b6105cb60043560005433600160a060020a039081169116141561015e5760008054600160a060020a0319168217905550565b6105cb6004356024356044356000805433600160a060020a039081169116141561031c5760e060020a63a9059cbb026060908152600160a060020a03848116606452608484905285929083169163a9059cbb9160a4916020916044908290876161da5a03f115610002575050505b50505050565b6105cb60043560005433600160a060020a039081169116141561015e5760028054600160a060020a0319168217905550565b6105cb60043560243560005433600160a060020a03908116911614156105075760015460e060020a6370a0823102606090815230600160a060020a0390811660645291909116906370a08231906084906020906024816000876161da5a03f1156100025750506040805180516006556002546001547f1a695230000000000000000000000000000000000000000000000000000000008352600160a060020a039081166004840152925192169250631a695230916024828101926000929190829003018183876161da5a03f1156100025750505060048181556003839055600154604080517f013cf08b00000000000000000000000000000000000000000000000000000000815292830185905251600160a060020a03919091169163013cf08b91602482810192602092919082900301816000876161da5a03f11561000257505060408051805160058054600160a060020a0319169091179081905560015460035460e260020a63209987710284526004840152600160a060020a0391821660248401529251921692506382661dc491604482810192602092919082900301816000876161da5a03f115610002575050505b5050565b60408051918252519081900360200190f35b60015460e060020a6370a0823102606090815230600160a060020a0390811660645291909116906370a082319060849060209060248187876161da5a03f11561000257505060408051805160015460025460e060020a63a9059cbb028452600160a060020a039081166004850152602484018390529351919550909216925063a9059cbb916044828101926020929190829003018188876161da5a03f115610002575050505b600191505090565b005b6060908152602090f3 

Ils « re traitée de cette manière

echo "INPUT_DATA" >> file_name && evm disasm file_name 

Et les données de sortie ressemble à ceci:

000000: PUSH1 0x60 
000002: PUSH1 0x40 
000004: MSTORE 
000005: CALLDATASIZE 
000006: ISZERO 
000007: PUSH2 0x006c 
000010: JUMPI 
000011: PUSH1 0xe0 
000013: PUSH1 0x02 
000015: EXP 
000016: PUSH1 0x00 
000018: CALLDATALOAD 
000019: DIV 

ce que je voudrais finalement voudrais faire est Rende r cette sortie comme CSV (ou peut-être aussi JSON). Quelque chose comme ceci:

PUSH1 0x60, PUSH1 0x40, MSTORE, CALLDATASIZE, ISZERO, PUSH2 0x006c, JUMPI, PUSH1 0xe0, PUSH1 0x02, EXP, PUSH1 0x00, CALLDATALOAD, DIV 

Cependant, au moment où je suis en train de vous connecter uniquement à la console, avec ce script:

import sys 
import subprocess 

def my_test_func(filename, data): 
    with open(filename, 'w') as fd: 
     fd.write(data) 
     fd.write('\n') 
    return subprocess.check_output(['evm', 'disasm', filename]) 




if '__main__' == __name__: 

    file_name = sys.argv[1] 
    byte_code = sys.argv[2] 
    status = my_test_func(file_name, byte_code) 

    # python opcode-farmer.py 'tst2' '6005600401' 
    print(status) 

^Ce scénario est un peu propre, car il fait un sous -processus dans le script Python comme vous pouvez le voir. Ce que j'aimerais savoir, c'est quel est le meilleur moyen de récupérer cette sortie, et au lieu de simplement l'écrire dans la console, de la transformer en un processus qui peut la transformer en CSV. J'ai quelques idées bien sûr sur la façon de le faire mais, à peu près sans exception, mes idées ont tendance à être les plus coûteuses et les plus inélégantes possibles, alors je veux voir quel type de suggestions la communauté SO propose .

Ce genre de travaux:

edits = csv.reader(status.splitlines(), delimiter=",") 
for row in edits: 
    print(row) 

Mais aussi- pas vraiment- donne cette sortie:

['6005600401'] 
['000000: PUSH1 0x05'] 
['000002: PUSH1 0x04'] 
['000004: ADD'] 

Ce qui est sous-optimale en deux de première All- façons-de listes ou Il est difficile de travailler avec des dicts comme ça plus tard - et aussi - cela ne supprime pas toute l'information superflue. Ai-je besoin d'utiliser regex pour ça?

Ce que je veux vraiment est la suivante:

PUSH1 0x60, PUSH1 0x40, MSTORE, CALLDATASIZE, ISZERO, PUSH2 0x006c, JUMPI, PUSH1 0xe0, PUSH1 0x02, EXP, PUSH1 0x00, CALLDATALOAD, DIV 

Répondre

1

Comment cela?

', '.join([' '.join(line.split()[1:]) for line in status.splitlines()]) 
+0

alors, où cela correspond-il? J'ai programmé pendant de nombreuses heures et maintenant je suis en quelque sorte - je ne vois pas clairement comment intégrer ce composant –