所以,我创建了一个名为jel
的命令,它可以作为jel
执行。它在Python中运行,当我运行jel doctor
时,在jel.py
中它会给我一个错误(主文件)。代码如下所示:请注意,所有必需的模块都已导入。
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
我相信它说该目录不存在,尽管它确实存在。我以前需要打电话吗?
答案 0 :(得分:2)
您的代码段至少存在三个问题:
cd
是内置的shell,而不是可执行程序。如果要调用cd
,则需要调用shell。
cd
命令仅影响运行它的shell。它对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:
答案 1 :(得分:1)
正如已经指出的那样,更改目录只会反映在子进程中。您应该使用os.chdir
来更改工作目录,但另一种方法是将 cwd 指定为子进程,这样就不需要 cd 或 os.chdir :
version = subprocess.check_output(['node', 'version.js'], cwd="js")
您还应该在if中使用!=
,并且您可能希望 rstrip 换行:
if version != ver.rstrip():