web-dev-qa-db-ja.com

別のフォルダーでのコマンドライン実行

os.system(command)呼び出しを使用して、python)でコマンドラインプログラムを呼び出しています。

別のフォルダーを渡して実行するこのコマンドを呼び出すにはどうすればよいですか?これにはシステムコールがありますか?または、現在のフォルダーを保存し、実行後に変更して復元する必要があります。

42
Victor

subprocess モジュールは非常に優れたソリューションです。

import subprocess
p = subprocess.Popen([command, argument1,...], cwd=working_directory)
p.wait()

また、環境変数の変更、呼び出しプログラムへの入出力のリダイレクトなどの引数もあります。

76
hynekcer

コマンドを呼び出す前にos.chdir(path)を試してください。

ここ から:

os.chdir(path)現在の作業ディレクトリをパスに変更します。

可用性:Unix、Windows

[〜#〜] edit [〜#〜]

これにより、現在の作業ディレクトリが変更されます。現在の作業ディレクトリは次の方法で取得できます。

os.getcwd()

元の作業ディレクトリで作業を行う必要がある場合に、保存して後で復元する場合。

EDIT 2

いずれにせよ、おそらく here のようにsubprocessdoc )に移動する必要があります。 subprocessPopenを使用する場合、cwdパラメーターを指定して、サブプロセスの作業ディレクトリを指定できます: read this

subprocess.Popen(args, bufsize=0, executable=None, stdin=None,
stdout=None, stderr=None, preexec_fn=None, close_fds=False,
Shell=False, cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0)

...

CwdがNoneでない場合、子の現在のディレクトリは実行前にcwdに変更されます。このディレクトリは実行可能ファイルの検索時に考慮されないため、cwdに対するプログラムのパスを指定できないことに注意してください。

10
zenpoy

ここでは、作業中のパスを変更する小さな関数を作成しました。

_import os
def make_path(r_path):  
    ack = 1
    try:
        root = os.path.dirname(__file__)
        rel_path = os.path.join("..", r_path)

        abs_path = os.path.join(root, rel_path)
        os.chdir(abs_path)
        ack = 0
    except Exception as details:
        print('problem to get to the path '+r_path+' (0001) : ' + str(details))
    return ack
_

したがって、ここで_r_path_は、行きたい相対パスです。 _".."_をpath.join()メソッドに追加したので、フォルダー内にいて、パスを検索する前にフォルダーを終了する場合、自動的に実行されます。したがって、相対ディレクトリが次のようになっている場合:

_-path_to_reach
    -a_random_file.txt
-your_current_folder
    -your_program.py
_

これらの行を実行して_path_to_reach_内に移動し、exempleでコマンドを作成できます。

_command = ls
make_path('path_to_reach/')
os.system(command)
_

このコマンドは有用ではありませんが、アイデアはわかります!