2016-05-17 4 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 запускается на узле, и выглядит следующим образом: Все необходимые пакеты установлены

var latest = require('latest'); 

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

Это дает мне эту ошибку, когда файл jel.py использует subprocess позвонить 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 изменить рабочий каталог, но другой альтернативы можно указать УХО подпроцесс, который избегает необходимости в кд или os.chdir:

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

Вы также должны использовать != в вашем если и вы, вероятно, хотите rstrip символа новой строки:

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

Да, 'cwd =" js "' намного предпочтительнее моего 'cd js &&'. –

Смежные вопросы