コードに2つの問題があります。最初は、デフォルトで使用されるシェルが/bin/sh
で、pushd
とpopd
をサポートしていないことです。 は、あなたの質問では、全体のエラー出力を提供することができなかった、そしてそれの一番上に次の行が表示されるはずです。
/bin/sh: 1: popd: not found
次の時間が全体エラーメッセージだけではなく、一部を投稿するrememeberそのあなたは(間違っている)と考えています。
あなたはシェルがexecutable
引数を経由して使用するsubprocess
モジュールを伝えることで、この問題を解決することができます
>>> subprocess.check_call('pushd ~', shell=True, executable='/bin/bash')
~ ~
0
第二の問題は、あなたが複数のcheck_call
呼び出しを使用している場合でも、これであなたがエラーを取得することです。
P
>>> subprocess.check_call('pushd ~', shell=True, executable='/bin/bash')
~ ~
0
>>> subprocess.check_call('popd', shell=True, executable='/bin/bash')
/bin/bash: riga 0: popd: stack delle directory vuoto
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/subprocess.py", line 581, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'popd' returned non-zero exit status 1
これはcheck_call
へのすべての呼び出しは、新しいサブシェルを開始しているので、したがって、それはあなたかどうかは関係ありませんディレクトリ・スタックは常に空であるため、後でpushd
と呼ばれます。あなたのpythonからそのようにpushd
とpopd
を使用して考えた場合、
>>> subprocess.check_call('pushd ~ && popd', shell=True, executable='/bin/bash')
~ ~
~
0
今事実がある:あなたが単一の呼び出しでpushd
とpopd
を結合しようとした場合、彼らは仕事をこと
は 注意。 ..彼らは役に立たないです。あなたはcwd
引数を経て現在の作業ディレクトリを指定することができ、そしてあなたがpushd
とpopd
に依存することなく、パイソンからの作業ディレクトリのスタックを追跡することが可能だからです。
current_working_dirs = []
def pushd(dir):
current_working_dirs.append(os.path.realpath(os.path.expanduser(dir)))
def popd():
current_working_dirs.pop()
def run_command(cmdline, **kwargs):
return subprocess.check_call(cmdline, cwd=current_working_dirs[-1], **kwargs)
pushd('xxx')
とcheck_call('popd')
でcheck_call('pushd xxx')
を交換してくださいpopd
とし、check_call(...)
の代わりにrun_command(...)
を使用してください。
あなたはよりエレガントな解決策は、コンテキストマネージャを使用することです示唆したよう:私は今、私の質問を編集した
with Pwd('~') as shell:
shell.run(command)
with Pwd('/other/directory') as shell:
shell.run(command2) # runs in '/other/directory'
shell.run(command3) # runs in '~'
:
として使用します。申し訳ありませんが早く間違いました。私は 'check_call()'が新しいシェルを生成することを知っています。問題は 'pushd'を呼び出した後に' popd'を呼び出すことではありません。それは本当に 'pushd'それ自体です。 – Ray
@レイあなたのアップデートに基づいて、Bakuriuの答えの重要な部分は、シェルがbashではないので利用可能なpushdがないということです。 Ubuntuでshを起動してpushdしようとします。 –
これはあまりにも有用であることを証明し得る:https://wiki.ubuntu.com/DashAsBinSh –