os.system(“pwd”)和os.getcwd()

时间:2016-06-05 05:23:29

标签: python python-2.7 subprocess os.system

我对以下3个函数系列有一个基本的疑问:

比如说,我想知道Python中当前的工作目录。因此,实现这一目标的一些方法可能是:

os.system("pwd")

os.getcwd()

subprocess.Popen(['pwd'], stdout=PIPE, stderr=PIPE)

我发现很多资源在线将上面的第三个与其他资源区分开来,但是在上面的前两个差异之间找不到多少。

请帮助我理解3之间的区别,尤其是

  1. 从输出的角度来看
  2. 从绩效角度来看
  3. 从实现的角度来看,也就是说,这三个内部实现的方式如何,对于它们中的每一个,它们是否产生了一个新进程,它们如何与内核进行交互等。
  4. 任何指向我的自我参考的指针也将非常感激。

3 个答案:

答案 0 :(得分:4)

pwd调用会更快,因为它不依赖于任何外部依赖项。您的第一个和最后一个示例都执行单独的进程Popen()系统命令,并将其输出作为字符串返回。好吧,你的os.getcwd()示例将要求你使用另一个电话获取其输出,但我离题了。

根本不需要调用外部命令;只需使用 string[] array1 = Directory.GetFiles(img_Source_TxtBox.Text); // string[] array1 = new string[] { "a", "d", "e", "c", "f", "i" }; Array.Sort(array1); // ascending order foreach (string aa in array1) { MessageBox.Show(aa.ToString()); } Array.Reverse(array1); // descending order foreach (string aa in array1) { MessageBox.Show(aa.ToString()); }

答案 1 :(得分:3)

这三者之间的主要区别在于,只保证一个os.getcwd()可以正常工作。

其他两个依赖于pwd,这在所有操作系统中都不可用。

正如@ {在their answer中提到的那样,不需要为这些信息产生一个单独的过程;它可能会给你意想不到的结果。

答案 2 :(得分:3)

找到性能问题的最佳方法是自己测量它。 Python实现各不相同。同样,如果您想了解它们的实现方式,请阅读源代码。

所有这些机制可能会在类UNIX系统上调用相同的底层C库接口getcwd(3)。只是有些人使用外部程序到达那里。

os.system("pwd")运行一个shell(第一个进程)来运行外部程序pwd(第二个进程)。因此,性能将很差并且不可移植,因为pwd未在所有支持Python的平台上实现。输出为stdout,未捕获该程序以供使用。

您省略了函数popen

wd = os.popen('pwd').readline()

这被认为是过时的,os.system()也是如此,两者都被subprocess取代。 popen实现可能使用C运行时库函数popen,它还调用shell来执行命令,因此性能可能很差。

subprocess模块旨在取代这些旧接口,因此重复。一个优点是shell的使用是可选的,在这种情况下你不需要它。但是你的代码不完整:

proc = subprocess.Popen(['pwd'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
wd, err = proc.communicate()
if err:
    print >> sys.stderr, err
else:
    print wd,

由于没有shell进程,因此效率会更高。但实际上你应该在自己的系统上自己进行基准测试。

到目前为止,所有接口都是通用 - 它们用于运行各种命令和外部程序。他们经常被滥用和使用不当的事实是对程序员缺乏理解(或懒惰)的反思。

我们留下os.getcwd()。它可能是作为对C库接口的直接调用实现的,但可能会绕过它来调用内核。检查实现的源代码。没有孩子处理,所以更快。

您还可以对许多其他界面os.remove()os.mkdir()os.stat()等进行重复。关键是这些是快速和便携的,它们不运行其他程序。

与使用shell相比,拥有这些直接接口是使用Python之类语言的主要优势。 Bash没有用于获取当前目录,获取文件大小,删除文件等的内置命令。它依赖于外部程序 - python没有。