2017-05-29 93 views
0

我有一個Python腳本,我寫的是從命令行調用的。我正在編寫一個GUI包裝,但不想更改主要功能。在GUI代碼中,我使用subprocess.run(['./executable.py', input])調用腳本,但輸入在executable.pysys.argv列表中不可見。如何通過輸入以便sys.argv可見?如何將輸入傳遞到另一個Python腳本的`sys.argv`列表中?

下面是測試腳本我已經保存爲test.py(使其可執行chmod +x test.py):

#!/usr/bin/env python 
# script to test using sys.argv with subprocess 

import sys 

print(sys.argv) 

以下是我得到的命令行調用這個時候:

$> ./test.py input.txt 
['./test.py', 'input.txt'] 

這裏當我在python shell中調用這個函數時會得到:

>>> import subprocess 
>>> output = subprocess.run(['./test.py', 'input.txt'], shell=True, stdout=subprocess.PIPE) 
>>> >>> print(output.stdout) 
b"['./test.py']\n" 

我如何獲得input.txt以顯示在sys.argv

+0

除非你完全知道你需要,否則你不應該使用'shell = True'。 –

回答

0

做到這一點,最安全的方式是簡單地刪除shell=True

>>> import subprocess 
>>> output = subprocess.run(['./test.py', 'input.txt'], stdout=subprocess.PIPE) 
>>> print(output.stdout) 
b"['./test.py', 'input.txt']\n" 

的另一種選擇是輸入列表合併成一個字符串:

>>> import subprocess 
>>> output = subprocess.run('./test.py input.txt', shell=True, stdout=subprocess.PIPE) 
>>> print(output.stdout) 
b"['./test.py', 'input.txt']\n" 

我不能完全確定爲什麼原始方法(輸入列表和shell=True失敗)失敗。無論如何,爲避免使用running unintended commands/code,最好避免使用shell=Truenote on when you should use shell=True)。

+0

最好是去掉'shell = True'。 – jordanm

+0

@ StevenC.Howell'shell = True'風險很大,詳情請看文檔:https://docs.python.org/3/library/subprocess.html#security-considerations – olisch

相關問題