cd目录不存在?

时间:2016-05-17 22:16:06

标签: python node.js

所以,我创建了一个名为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 jsnode 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

我相信它说该目录不存在,尽管它确实存在。我以前需要打电话吗?

2 个答案:

答案 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():