将命令传递给操作系统:这里有什么问题?

时间:2012-08-23 08:54:42

标签: python bash operating-system

所以,我想创建一个简单的脚本来根据某个文件夹中包含的文件名创建目录。

我的方法如下:

def make_new_folders(filenames, destination):
    """
    Take a list of presets and create new directories using mkdir
    """
    for filename in filenames:
        path = '"%s/%s/"' %  (destination, filename)
        subprocess.call(["mkdir", path])

由于某种原因,我无法让命令工作。

如果我传入一个名为“Test Folder”的文件,我会收到如下错误:

mkdir: "/Users/soundteam/Desktop/PlayGround/Test Folder: No such file or directory

打印'path'变量会导致:     “/ Users / soundteam / Desktop / PlayGround / Test Folder /”

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:7)

首先,您应该使用os.path.join()将路径部分粘合在一起,因为它可以跨平台工作。

此外,还有内置命令,如os.mkdiros.makedirs(这很酷,因为它是递归的)来创建文件夹。创建子流程很昂贵,在这种情况下,这不是一个好主意。

在您的示例中,您将双引号("destination/filename")传递给子流程,您不必这样做。如果你在文件或文件夹名称中使用空格,终端需要双引号,子进程会为你处理。

答案 1 :(得分:4)

您不需要双引号。 subprocess将参数直接传递给进程,因此您无需为shell进行解析而准备它们。您也不需要尾部斜杠,并且应该使用os.path.join来组合路径组件:

path = os.path.join(destination, filename)

编辑:你应该接受@Fabian的回答,这解释了你根本不需要子进程(我知道)。