2016-05-17 8 views
1

jelとして実行可能なjelというコマンドを作成しました。 Pythonで動作し、jel doctorを実行すると、jel.pyにエラー(メインファイル)が表示されます。コードは次のようになります。必要なモジュールはすべてインポート済みです。cdディレクトリが存在しませんか?

elif arg == 'doctor': 
subprocess.call(['cd', 'js']) 
ver = subprocess.call(['node', 'version.js']) 
subprocess.call(['cd', '..']) 
if not ver == version: 
    print 'jel doctor: \033[91found that version\033[0m ' + str(version) + ' \033[91mis not the current version\033[0m' 
    print 'jel doctor: \033[92mrun jel update\033[0m' 
    sys.exit() 

jsファイルversion.jsは、ノード上で実行され、次のようになりますさ:必要なすべてのパッケージはjel.pyファイルを呼び出すためにsubprocessを使用する場合、それは私にこのエラーを与えている

var latest = require('latest'); 

latest('jel', function(err, v) { 
    console.log(v); 
    // => "0.0.3" 
    if (err) { 
     console.log('An error occurred.'); 
    } 
}); 

をインストールされていますcs jsおよびnode version.js

Traceback (most recent call last): 
    File "/bin/jel", line 90, in <module> 
    subprocess.call(['cd', 'js']) 
    File "/usr/lib/python2.7/subprocess.py", line 522, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.7/subprocess.py", line 710, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 
bjskistad:~/workspace (master) $ jel doctor 
Traceback (most recent call last): 
    File "/bin/jel", line 90, in <module> 
    subprocess.call(['cd', 'js']) 
    File "/usr/lib/python2.7/subprocess.py", line 522, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.7/subprocess.py", line 710, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

私はディレクトリが存在しないと言っていると思いますが、それはあります。それ以前に別のものを呼び出す必要がありますか?

+1

いいえ、 'cd'ファイルが存在しないと言っています。 'cd'はシェルであり、実行可能ファイルではありません。 –

+0

@Robᵩはい、 'js'ディレクトリが見つけられ、' version.js'はノードによって実行されるべきです。 –

+0

@RobᵩPlus、私はそれを私のbashで走らせ、それは働いた。 –

答えて

2

コードスニペットと、少なくとも三つの問題があります。

  • cdは、組み込みのシェルではなく、実行可能なプログラムです。 cdを呼び出す場合は、シェルを起動する必要があります。

  • cdコマンドは、実行されるシェルにのみ影響します。 pythonプログラムまたは後続のサブプロセスには影響しません。

  • subprocess.call()の戻りコードは、プログラムがstdoutに書き込んだテキストではありません。そのテキストを取得するには、subprocess.check_output()を試してください。

これを試してみてください:

#UNTESTED 
elif arg == 'doctor': 
ver = subprocess.check_output(['cd js && node version.js'], shell=True) 
if not ver == version: 
+0

'ver'が設定されていない場合、check_outputは単純にバージョンを出力しています。 –

1

は、すでに述べたようにのみサブプロセスに反映されているディレクトリを変更することを指摘しました。あなたの作業ディレクトリを変更するos.chdirを使用する必要がありますが、別の選択肢がCDまたはos.chdirに任意の必要性を回避するサブプロセスにCWDを指定することです:

version = subprocess.check_output(['node', 'version.js'], cwd="js") 

また、あなたに!=を使用する必要がありますあなたはおそらくrstrip改行したい場合:

if version != ver.rstrip(): 
+0

はい、 'cwd =" js "'は私の 'cd js &&'よりもはるかに優れています。 –

関連する問題