How to use the dir/s command in Python?
背景
我一直在批处理文件中使用命令dir/s。但是,我不能用Python来调用它。注意:我使用的是python 2.7.3。
代码
1 2
| import subprocess
subprocess.call(["dir/s"]) |
错误信息
1 2 3 4 5 6 7 8 9 10
| Traceback (most recent call last):
File"<pyshell#2>", line 1, in <module>
subprocess.call(["dir/s"])
File"C:\Python27\lib\subprocess.py", line 493, in call
return Popen(*popenargs, **kwargs).wait()
File"C:\Python27\lib\subprocess.py", line 679, in __init__
errread, errwrite)
File"C:\Python27\lib\subprocess.py", line 896, in _execute_child
startupinfo)
WindowsError: [Error 2] The system cannot find the file specified |
我试过修改报价单,但没用。
如何使用subprocess调用dir/s模块?
- 为什么不使用os.listdir(在一个循环中)?
- @T-8ch更容易使用os.walk()。
- @你的代码都不起作用。我无法获取目录列表。
- 伙计们-请在写代码之前检查一下。到目前为止,什么都没有起作用。:(
- @也许你应该多注意你在读什么。我没有发布任何代码,我只是提到了一个可以用来完成工作的数学模型。在手册中查一下,看看它是如何工作的。
- @我的意思是,当我试图在一个循环中使用os.walk时,它不起作用。第二个和你无关。
- 所有-1的原因是什么?我能做些什么来改进这个问题,即使它已经解决了?
- python可能重复执行windows命令函数
怎么样
1
| subprocess.call("dir/s", shell=True) |
未经验证。
- 已验证,所以+1。
- 如果不需要的话,不要使用shell=True,subprocess.call(["cmd","/c","dir","/s"])更好。
- @Piotr Dobrogost为什么更好?当然,这是一个简单的例子,但一般来说,编写一个像shell期望的那样格式化的字符串不是最好的方式吗?
- @tDelaney因为shell=true通常不像shell=false那么安全。"如果与不受信任的输入结合使用,则使用shell=true调用系统shell可能会带来安全隐患。"
- @当我运行代码时,它只返回0,而不打印目录。原因是什么?
- @xxmbabanexx将"call"替换为"check_output"
- @ZZK我如何获得D:\` Drive? Also, why did the original code return 0? Lastly, what is the difference between call`和check_output的目录?谢谢你的帮助!
- @xxmbabanexx阅读本页:docs.python.org/2/library/subprocess.html
- @为什么会冻结我的电脑?
这与你的要求大不相同,但它解决了同样的问题。此外,它以一种多平台的方式解决了这个问题:
1 2 3 4 5 6 7 8 9
| import fnmatch
import os
def recglob(directory, ext):
l = []
for root, dirnames, filenames in os.walk(directory):
for filename in fnmatch.filter(filenames, ext):
l.append(os.path.join(root, filename))
return l |
- 当我这样做时,错误消息告诉我没有定义directory。我还假设ext也不起作用。不好意思你是一个0.0亿的人,但你能把整个事情都写下来吗?
- 您需要使用两个参数来调用这个函数-目录路径和您需要glob的文件的扩展名。示例:recglob('C:\foo\bar', '.baz')
- @Tuxdude我该如何让全球的名字fnmatch起作用?另外,我可以通过执行".*"获得所有文件的列表吗?这有可能吗?有可能吗?非常感谢你的帮助。
- @xxmbabanexx:在脚本的开头添加一个import fnmatch。同样,您还需要与import os连接的另一条线路。
- @马蒂诺,我以为埃多克斯一〔9〕已经过时了。我知道有例外。这是他们中的一个吗?
- @xxmbabanexx:不确定你所说的"过时"是什么意思。我之所以提到它,是因为您似乎不知道您需要使用import fnmatch才能使用它,而这种逻辑同样适用于os的函数。
- 令人惊叹的!这就是我要找的
我终于找到了答案。要列出目录(如D:\\和C:\\中的所有目录,首先需要导入os模块。
然后,他们需要说他们想列出所有的东西。在这个过程中,他们需要确保输出被打印出来。
1 2 3
| for top, dirs, files in os.walk('D:\'):
for nm in files:
print os.path.join(top, nm) |
这就是我解决问题的方法。多亏了这一点。
在dir和/s之间需要一个空格。所以把它分成2个元素的数组。正如carlosdoc指出的,您需要添加shell=true,因为dir命令是shell内置的。
1 2
| import subprocess
subprocess.call(["dir","/s"], shell=True) |
但是,如果您试图获得目录列表,可以使用os模块中的可用功能(如os.listdir()和os.chdir()使其独立于操作系统。
- 我不这么认为。dir是一个内置命令(没有dir.exe)
- @Carlosdc-谢谢,我现在已经添加了shell=true,所以即使是内置的也可以。
- @卡洛斯·德克,这些都没用。不过,我有兴趣让它独立于平台。我如何使用os函数?
- 在Windows Shell/控制台中,在dir和/s之间不需要空间。
- 当shell=true时使用字符串,当shell=false时使用列表。
- @xxmbabanexx平台独立的方法是使用os.walk()或os.listdir()。你可以用谷歌搜索样本,因为几乎没有什么诀窍要知道。
因为它是命令行的一个内置部分,所以您需要以以下方式运行它:
1 2
| import subprocess
subprocess.call("cmd /c dir /s") |
- 这不起作用。我也收到了一条错误消息。
- 甚至都不接近!您试图运行shell命令,但使用非shell列表语法并保留shell=false。
- @特德莱尼:实际上是相当接近的,如果稍微改成subprocess.call(["cmd","/c","dir","/s"])就可以了。
- @martineau-直接调用程序(使用列表)和通过shell调用程序(使用字符串并设置shell=true)有很大的区别。子流程会让很多人绊倒…但也许我的叫声有点大。你的混血儿(明确地叫shell而不是shell=true)也让我抓耳挠腮!我想我更喜欢以subprocess.call("dir/s",shell=true,stdout=subprocess.pipe)为例。
- @特德利尼:我没有说这是一个最佳的方法,只有一个微小的变化,它会工作。我开始怀疑,也许你只是倾向于夸大一些事情,因为阿法克在使用shell=True和自己称呼它之间没有太大的区别,因为它被称为任何一种方式——尽管我想有些人可能会认为前者更明确。
- 这对我来说毫无瑕疵。
- 这对我也有用,所以我不确定为什么它对某些人不起作用。我认为shell=true不是必需的,因为它显式地将cmd作为命令的一部分调用——尽管这可能是编写命令的更好方法。