2017-09-13 38 views
1

我正在使用python,我應該從命令行讀取文件以供進一步處理。我的輸入文件有一個二進制文件,應該讀取它以便進一步處理。這是我的輸入文件sub.py:如何在python中從命令行導入文件

CODE = " \x55\x48\x8b\x05\xb8\x13\x00\x00" 

和我的主文件,它應該閱讀這是這樣的:

import pyvex 
import archinfo 
import fileinput 

import sys 
filename = sys.argv[-1] 


f = open(sys.argv[-1],"r") 
CODE = f.read() 
f.close() 
print CODE 

#CODE = b"\x55\x48\x8b\x05\xb8\x13\x00\x00" 
# translate an AMD64 basic block (of nops) at 0x400400 into VEX 
irsb = pyvex.IRSB(CODE, 0x1000, archinfo.ArchAMD64()) 

# pretty-print the basic block 
irsb.pp() 

# this is the IR Expression of the jump target of the unconditional exit at the end of the basic block 
print irsb.next 

# this is the type of the unconditional exit (i.e., a call, ret, syscall, etc) 
print irsb.jumpkind 

# you can also pretty-print it 
irsb.next.pp() 

# iterate through each statement and print all the statements 
for stmt in irsb.statements: 
     stmt.pp() 

# pretty-print the IR expression representing the data, and the *type* of that IR expression written by every store statement 
import pyvex 
for stmt in irsb.statements: 
    if isinstance(stmt, pyvex.IRStmt.Store): 
    print "Data:", 
    stmt.data.pp() 
    print "" 

    print "Type:", 
    print stmt.data.result_type 
    print "" 

# pretty-print the condition and jump target of every conditional exit from the basic block 
for stmt in irsb.statements: 
     if isinstance(stmt, pyvex.IRStmt.Exit): 
       print "Condition:", 
       stmt.guard.pp() 
       print "" 

       print "Target:", 
       stmt.dst.pp() 
       print "" 

# these are the types of every temp in the IRSB 
print irsb.tyenv.types 

# here is one way to get the type of temp 0 
print irsb.tyenv.types[0] 

的問題是,當我運行「蟒蛇maincode.py子。 py'它將代碼作爲文件的內容讀取,但其輸出與直接將CODE添加到語句irsb = pyvex.IRSB(CODE, 0x1000, archinfo.ArchAMD64())中的輸出完全不同。有誰知道什麼是問題,我該如何解決它?我甚至使用從輸入文件導入,但它不會讀取文字

+0

請分享輸出獲得並指出您實際預期的輸出。 –

回答

0

您正在閱讀的內容E碼爲文本,文件中讀取數據時,而你可能讀爲二進制

你可能需要二進制轉換成反之亦然文本,使這項工作

Binary to String/Text in Python

+0

這不是一個二進制,這是十六進制,甚至以​​這種方式轉換它不工作。 – sarah123

1

您曾經考慮過__import__方式?

你可以做

mod = __import__(sys.argv[-1]) 
print mod.CODE 

,只是通過文件名不帶.py擴展名作爲命令行參數:

python maincode.py sub 

編輯:顯然使用__import__discouraged。相反,雖然你可以使用導入庫模塊:

import sys,importlib 
mod = importlib.import_module(sys.argv[-1]) 
print mod.CODE 

..和它應該工作一樣使用__import__

如果你需要的路徑傳遞到模塊,一個方法是,如果在每個目錄中您添加了一個名爲的空文件

__init__.py 

這將使Python來解釋該目錄爲模塊命名空間,然後你可以通過在其模塊形式的路徑:python maincode.py path.to.subfolder.sub

如果出於某種原因,您不能或不想將名稱空間添加爲目錄,並且不想將init.py文件添加到任何地方,則還可以使用imp.find_module。你maincode.py反而會是這樣的:

import sys, imp 
mod = imp.find_module("sub","/path/to/subfolder/") 
print mod.code 

你必須編寫代碼打散您的命令行輸入到模塊部分「子」的文件夾路徑「/路徑/到/子文件夾/ 「雖然。那有意義嗎?一旦準備就緒,您可以像預期的那樣稱呼它,python maincode.py /path/to/subfolder/sub/

+0

如果我想在命令行中輸入文件夾,輸入文件怎麼辦?我試過sudo python tnt_test.py \ test \ sub但是它說mod = __import __(sys.argv [-1]) ImportError:按文件名導入不是支持的。我怎麼解決這個問題? – sarah123

+0

看到我編輯的答案。我試着在這裏鍵入它,但是不斷在init.py文件的下劃線丟失,以達到stackoverflow的自動配置...你必須用下劃線來命名該文件 – stackPusher

+0

謝謝你的回覆。但它不適合我。我因錯誤__import __(名稱)而停止。 ImportError:不支持按文件名導入 – sarah123

相關問題