我对以下3个函数系列有一个基本的疑问:
比如说,我想知道Python中当前的工作目录。因此,实现这一目标的一些方法可能是:
os.system("pwd")
os.getcwd()
subprocess.Popen(['pwd'], stdout=PIPE, stderr=PIPE)
我发现很多资源在线将上面的第三个与其他资源区分开来,但是在上面的前两个差异之间找不到多少。
请帮助我理解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没有。