2016-09-30 2 views
0

私は本質的にシェル端末である単純なスクリプトをPythonで作成しようとしています。繰り返し入力コマンドを要求し、与えられたosコマンドを実行しようとします。私が理解できないことは、実行されたコマンドをPythonに「記憶させる」方法です。私が言いたいの関連するosコマンドをPythonで実行する

例:カレントディレクトリの

  1. ユーザ入力ls
  2. パイソンプリントの内容
  3. 次のユーザ入力cd exampledir
  4. Pythonはコマンドに
  5. ユーザ入力を実行ls
  6. Pythonはの内容を出力しますコマンドシーケンス以来210

は、私はプログラムがexampledirの内容を返すことを期待ls>cd exampledir>lsであるが、代わりに2つのlsコマンドの出力は同じです。

Pythonに何らかの形で実行されたコマンドが記憶され、前のコマンドに基づいて次のコマンドが実行される方法はありますか?

cd exampledir && lsのようなものを使用できますが、これは私が探しているものではありません。コマンドは、シェル端末のように別々に実行する必要があります。

コードこれまで:

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

あなたはsubprocessモジュールと外cdをカント、あなたの代わりに何ができるかの機能が実行されますが、パスが実行されているPythonスクリプトのために変更する文句を言わない、
ものです以下のような:

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

これはあなたが実行しているPythonスクリプトのパスを変更し、その後することができますls異なる出力を取得します。

+0

返信いただきありがとうございます。このプロジェクトのポイントは、ユーザーがosコマンド(端末など)を入力できるWebアプリケーションを作成することです。これらのコマンドはサーバーに送信され、実行され、出力がWebアプリケーションに返されます。私はこの「コマンド連鎖」を行う一般的な方法を探しています。コマンドのように、 'ls'から 'grep'から 'scp'まで何でもかまいません。あたかもサーバーの実際の端末を使用しているかのように、ユーザーはコマンドを実行できるはずです。 各コマンドの結果が記憶されるシェルセッションのように私が作ることができる方法を知っていますか? – Chaosy

+0

でも、すべてのコマンドをチェックしてフィルタリングする必要はありますが(上のように)、そのまま入力を許可することはできません。それは危険です。 –

0

あなたが理解しなければならないことは、フルシェルコマンドのインタプリタを書いてほしいということです。つまり、の状態シェル ...)を変更するコマンドは、内部状態を変更する必要があります。

意味:あなたのpython "インタープリタ"は特定のディレクトリ内で起動します。だから、のディレクトリにという名前のインタプリタを通訳すると、その要求を1秒後に消えるシェルに送ることはできません。

他の言葉で言えば、あなたはそれを両方向に持つことはできません。いずれかのすべてのコマンドをサブプロセスに渡すか、あなたの質問を構成する問題につながる。あるいは、あなたの「通訳」が「すべての仕事」をしています。

あなたが推測したように、「シェル」を書くことは複雑な作業です。あなたはその車輪を再発明すべきだと思いますか?

+0

私が構築しようとしているのは、Webアプリケーションを監視するサーバーです。このアプリはサーバーのリソース(CPU、メモリなど)を監視し、ユーザーが端末エミュレータを起動できるようにします。この端末エミュレータは、ユーザからのシェルコマンドを受け入れ、WebSocketを介してPythonが実行するサーバにそれらを送信します。 WebSocketを介して出力をユーザーに返します。このようなことができるかどうかを判断しようとしています。 – Chaosy

関連する問題