2016-09-30 1 views
2

まず、これを行うためのより良い方法があることはわかっています。私はサブプロセスの最も基本的な動作を学びたいと思っています.Popen()はさまざまなUNIXコマンドと対話するときに使います。私はディレクトリのナビゲーションに何か間違っているし、私はそれが何であるか分かりません。私は自分のREPLとしてiPythonを実行しているので、lsコマンドは現在の作業ディレクトリにファイルを表示します。Linuxのディレクトリを移動するためにpythonサブプロセスモジュールを使用する際に助けが必要

誰かが間違っていることを教えてください!

In [61]: newtree_dirs 
Out[61]: 
['10dir', 
'1dir', 
'2dir', 
'3dir', 
'4dir', 
'5dir', 
'6dir', 
'7dir', 
'8dir', 
'9dir'] 

In [62]: ls 
10dir/ 1dir/ 2dir/ 3dir/ 4dir/ 5dir/ 6dir/ 7dir/ 8dir/ 9dir/ 

In [63]: for folder in newtree_dirs: 
    ...:  p1 = sub.Popen(['cd', './{}'.format(folder)]) 
    ...:  p1.communicate() 
    ...:  foo = (i for i in xrange(10)) 
    ...:  for num in foo: 
    ...:   p2 = sub.Popen(['touch', '{}file'.format(num)]) 
    ...:   p2.communicate() 
    ...:  p3 = sub.Popen(['cd', '..']) 
    ...:  p3.communicate() 
    ...: 
    ...: 
--------------------------------------------------------------------------- 
OSError         Traceback (most recent call last) 
<ipython-input-63-bb6e77faf97b> in <module>() 
     1 for folder in newtree_dirs: 
----> 2  p1 = sub.Popen(['cd', u'./{}'.format(folder)]) 
     3  p1.communicate() 
     4  bar = (i for i in xrange(10)) 
     5  for num in bar: 

この例外が発生した後、さらなる例外は、欠落しているディレクトリのサブプロセスモジュールのエラー処理に下がります。私のcwdのディレクトリ名は同じで、何が起こっているのかわかりません。

+0

正確にはエラーメッセージは何ですか?単一のPopen(cd)コマンドをハードコーディングしてみて、それがループするのではなく、単独で動作するかどうか確認してください。 –

+0

「OSError:[Errno 2] No ** file ** or directory」というエラーが表示されますか? –

答えて

1

sub.Popen(['cd', './10dir')が提起「OSErrorの:[errnoを2]いいえ、そのようなファイルまたはディレクトリ」にcdをという名前のようなファイルが存在しないため、あなたの$PATH(そしておそらくあなたのコンピュータ上のすべてで)。 cdはスタンドアロンの実行可能ファイルではありません。シェル内蔵です。単独の実行可能ファイルであれば、子プロセスが親の現在の作業ディレクトリ、環境変数、userを直接変更できないため、シェルの現在の作業ディレクトリ(またはそのスクリプトのためのスクリプト)を変更することはできませんIDなど

さらに詳しい情報:
builtin vs normal command

注:技術的には、OSがそれ自身の現在のディレクトリとリターンを変更するスタンドアロンの実行可能cdを提供しなければならないcd組み込みシェルに加えて、POSIXの準拠のであるためにしかし、多くのLinuxディストリビューションはそれを含んでいません。出典:Why is cd not a program?

+0

私はこれをいくつかの組み込み関数で試してみましたが、その試行からあなたが正しいと思われます。 subprocess.Popen(['pwd'])に対して 'no such file or directory'例外が再度ポップアップしました。シェル組み込み関数の機能をエミュレートするために、いくつかのos-module関数を使ってサブプロセスを増やす必要があるようです。 –

関連する問題