2015-10-09 109 views
1

我有一個python腳本,我調用JIRA API並從JIRA獲取某些內容,我想寫出這些內容到文件中。如何將subprocess.call的結果打印到python腳本中的文件中

在CMD此命令工作正常

curl -D- -u username:password -X GET --data @file.json -H "Content-Type: application/json" http:URL >> output.json 

但是,當我嘗試做在Python一樣,它不是寫我的文件(直開到我的「東西是錯誤的」)

#Runs curl script to get component 
def write(): 
    name = 'output.json' 

try: 
    file= open(name, 'w') 
    file.write(subprocess.call('curl -D- -u username:password -X GET --data @file.json -H "Content-Type: application/json" http:URL')) 
    file.close() 

except: 
    print('something is wrong') 
    sys.exit(0) 
write() 

我也試過只寫下面的變量的內容。

curler = (subprocess.call('curl -D- -u username:password -X GET --data @file.json -H "Content-Type: application/json" http:URL')) 

def write(): 
    name = 'output.json' 

try: 
    file = open(name, 'w') 
    file.write(curler) 
    file.close() 

except: 
    print('something is wrong') 
    sys.exit(0) 
write() 

我使用Windows 7和Python 3

+0

你真的需要做一個shell命令嗎?處理返回的數據。 – AChampion

+0

您可以向我們展示Traceback,以便我們看到實際的錯誤? – keda

+0

請參閱[subprocess.check_output()](https://docs.python.org/2/library/subprocess.html#subprocess.check_output) – robert

回答

3

subprocess.call()需要的參數列表,只是返回調用進程的退出狀態。我認爲你正試圖將標準輸出重定向到一個文件:

curl = ['curl', '-D-', '-u', 'username:password', '-X', 'GET', '--data', 
     '@file.json', '-H', 'Content-Type: application/json', 'http:URL'] 
with open('output.json', 'w') as file: 
    status = subprocess.call(curl, stdout=file) 
+0

我正在改變路線(使用請求),但這似乎確實是我的問題的正確解決方案,所以我會這樣做。謝謝! – PolarisUser

+0

Windows'CreateProcess'採用命令行字符串,而不是POSIX樣式參數列表或參數數組。在Windows上傳遞列表的唯一原因是爲了跨平臺兼容性,並讓'Popen'引用每個VC++解析規則的命令。在這種情況下,該命令已被正確引用,例如:'subprocess.list2cmdline(curl)=='''curl -D- -u username:password -X GET --data @ file.json -H「Content-Type: application/json「http:URL」。所需要的只是傳遞'stdout = file'來重定向它的標準輸出。 – eryksun

+0

謝謝你讓我知道,我沒有一臺Windows機器來測試。儘管我傾向於支持可移植性,但仍然會在Windows機器上使用該列表。 – AChampion

1

1 - 你得到一個異常的原因是因爲你傳遞參數的方式來子進程。你應該給子進程一個參數列表,而不是一個字符串。假設你想使用curl下載google.com:

subprocess.call(['curl', 'google.com']) 

2- subprocess.call返回退出代碼,而不是輸出。要將輸出重定向到一個文件:

subprocess.call(['curl', 'google.com'], stdout=open('myFileName', 'w')) 
相關問題