2016-11-12 103 views
0

我寫一個腳本來打開使用subprocess.Popen()的notepad.exesubprocess.Popen和相對目錄

import subprocess 
command = '%windir%\system32\\notepad.exe' 
process = subprocess.Popen(command) 
output = process.communicate() 
print(output[0]) 

這將引發FileNotFoundError

是否有可能改變/添加到上面代碼,使其與相對路徑工作? 我嘗試在C:\ Windows>中移動腳本後再次失敗。同樣設置shell = True,但也失敗了。 使用os.popen()編寫一個類似的腳本工作良好的相對路徑,無論腳本是從哪個目錄運行,但據我瞭解popen是不是前進的方式..

在世界的早期步驟編程/ Python的。任何輸入非常讚賞。

回答

0

使用os.path.expandvars擴大%windir%

command = os.path.expandvars('%windir%\\system32\\notepad.exe') 

其結果是,那麼可以傳遞到subprocess.Popen的路徑。

subprocess.Popen不展開環境變量,如%windir%。 shell可能但你真的不應該依賴shell=True來做到這一點。

1

臨提示:當你得到一個錯誤,要求系統執行命令,打印命令(如果適用,當前的工作目錄)。結果往往會讓你感到驚訝。

在你的情況,我懷疑你只是缺少一個反斜槓。使用這個來代替:

command = '%windir%\\system32\\notepad.exe' 

之前,你做出的改變,嘗試分配後立即打印的command值。我想你會發現「系統」中的領先「s」缺失,而且這個錯誤是顯而易見的。

HTH。

+0

感謝您的提示。我確實嘗試了兩種方法,在system32之前使用\或\\,但打印效果相同。 – mdn

0

你可以使用原始字符串,以避免增加一倍,你的反斜槓。

command = r'%windir%\system32\notepad.exe' 
+0

謝謝。你知道這個和熊貓一樣嗎?作爲DataFrame.index = DataFrame.index.str.replace(R「(string_to_replace」,「new_string」)?我認爲這envoked正則表達式..但現在我認爲它只是表示原始字符串爲你寫的。我已經看到了定期表達式以DataFrame.index.str.replace(r'(\ s \。* \)','new_string')的形式出現,因此令人困惑。 – mdn