2016-09-30 15 views
0

我試圖在python中創建一個基本上是shell終端的簡單腳本。它會反覆詢問輸入命令並嘗試執行給定的os命令。我無法弄清楚的是,如何讓Python'記住'已執行的命令。我的意思在python中執行相關的os命令

實施例:

  1. 用戶輸入ls
  2. Python的打印當前目錄的內容
  3. 接着用戶輸入cd exampledir
  4. Python的執行命令
  5. 用戶輸入ls
  6. Python打印的內容210

由於命令序列是ls>cd exampledir>ls我期望程序返回exampledir的內容,而是在兩個ls命令的輸出是相同的。

有沒有辦法讓Python以某種方式「記住」已執行的命令並根據以前的命令執行下一個命令?

我知道你可以使用類似cd exampledir && ls但這不是我要找的東西。這些命令必須像shell終端一樣單獨執行。

到目前爲止的代碼:

import subprocess 

while True: 
    cmd = input("Command to Execute: ") 
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    out = p.communicate()[0] 
    print(out) 

回答

1

你不能cd出與subprocess模塊,該功能將運行,但該路徑運行的python腳本,不會改變
你可以做什麼,而不是東西像:

import os 
if # condition where cd command used: 
    os.chdir("path/to/new/dir") 

,這將改變你正在運行的python腳本的路徑,然後你可以ls得到不同的輸出。

+0

感謝您的回覆。這個項目的重點是創建一個Web應用程序,用戶可以在其中輸入os命令(如在終端中),這些命令將發送到服務器,執行並將輸出返回到Web應用程序。我正在尋找一些通用的方式來做這個'命令鏈接'。就像命令可以是'ls'到'grep'到'scp'一樣。用戶應該能夠像使用服務器實際終端一樣執行命令。 那麼你知道我可以像shell會話那樣創建每個命令的結果嗎? – Chaosy

+0

好的,但你仍然必須檢查和過濾所有的命令(有點像上面),你不能允許輸入,因爲這是危險的。 –

0

你必須明白的是:你想寫一個完整的解釋器的shell命令。這意味着:任何改變你的shell狀態 ......的任何命令都需要改變,改變一些內部狀態。

含義:你的python「解釋器」從一個特定的目錄開始。所以當你告訴口譯員更改這個目錄時,它不能僅僅發送那個請求到一個稍後消失的shell。

換句話說:你不能兩面都有。您可以將全部命令傳遞給子進程;導致構成你的問題的問題。或者你的「口譯員」本身就是「所有的工作」。

只是爲了記錄:正如您可能已經猜到的 - 編寫一個「shell」是一項複雜的任務。是什麼讓你覺得你應該重新發明那個輪子?

+0

基本上我正在嘗試構建的是服務器監控Web應用程序。這個應用程序將監視服務器資源(CPU,內存等),也將允許用戶啓動終端模擬器。這個終端模擬器將接受來自用戶的shell命令,並通過WebSocket將它們發送到Python將執行它們的服務器。並通過WebSocket將輸出返回給用戶。我試圖弄清楚是否有可能這樣做。 – Chaosy