【问题标题】:Passing commands to OS: What is wrong here?向操作系统传递命令:这里有什么问题?
【发布时间】:2012-08-18 18:15:18
【问题描述】:

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

我的方法是这样的:

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])

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

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

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

打印“路径”变量会导致: "/Users/soundteam/Desktop/PlayGround/Test 文件夹/"

谁能指出我正确的方向?

【问题讨论】:

  • 确保在 mkdir 中使用 -p 选项,以防 /Users/soundteam/Desktop/PlayGround 文件夹不存在
  • 附带说明,请考虑使用 os.mkdiros.makedirs 而不是调用外部 mkdir 命令。

标签: python bash operating-system


【解决方案1】:

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

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

编辑:您应该接受@Fabian 的回答,这说明您根本不需要子流程(我知道)。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 2016-08-27
      • 2018-01-25
      • 2021-05-25
      相关资源
      最近更新 更多