需要帮助使用python子进程模块来导航Linux目录

时间:2016-09-30 23:06:24

标签: python linux shell

首先,我知道有更好的方法可以做到这一点。我试图在与各种UNIX命令交互时学习subprocess.Popen()的最基本行为。我对目录导航做错了,我不知道它是什么。我将iPython作为我的REPL运行,因此ls命令显示当前工作目录中的文件。

有人请告诉我我做错了什么!

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中的目录名称是相同的,我不知道发生了什么。

1 个答案:

答案 0 :(得分:2)

cd引发&#34; OSError:[Errno 2]没有这样的文件或目录&#34;因为$PATH(可能在您的计算机上)没有名为cd的文件。 cd不是一个独立的可执行文件,它是一个内置的shell。如果它是一个独立的可执行文件,它将无法更改shell(或您的脚本)的当前工作目录,因为子进程无法直接更改它的父进程和&#39; #39;当前工作目录,环境变量,用户ID等。

更多信息:
builtin vs normal command

注意:除了shell内置cd之外,技术上要成为POSIX兼容,操作系统必须提供一个独立的可执行文件func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 来改变它自己的当前目录和返回,但许多Linux发行版不包含它。资料来源:Why is cd not a program?