Python 子流程模块:"Could not make directory"

Python Subprocess Module: "Could not make directory"

我有一个 Python 脚本,它使用 'Argparser' 从命令行接收参数。这是我指定特定文件位置的地方。然后,我调用安装在我的盒子上的另一个命令行工具,并将文件的这个位置传递给那个工具。要运行,该工具需要创建一个输出目录。

现在,我的问题是该工具在我指定的位置创建输出目录没有问题。例如:#tool -o ~/output filelocation' 使工具从文件位置读取文件并在我的主文件夹中创建一个名为 'output' 的目录来存储结果。但是,当我在 Python 中使用子进程模块调用相同的东西时,它给了我一个错误:

subprocess.call(['tool', '-o ~/output', args.filelocation])

这导致:

Could not make directory ~/output

我 运行 所有这些都具有 root 权限。我不知道为什么这个 'tool' 在通过 subprocess 模块调用时无法创建目录。任何帮助将不胜感激。

编辑:即使我使用绝对路径,它也会给我同样的错误。例如,我使用:

subprocess.call(['tool', '-o /root/output', args.filelocation])

结果:

Could not make directory /root/bulk

~/ 由您的 shell 扩展,您的通话中未使用它。尝试在这里使用像 /home/myuser/output 这样的绝对路径。作为替代方法,使用 shell=True 可能会有所帮助,但这确实很危险,因为所有环境变量等都在使用中。

如果您想要使用 ~ 的选项,您可以使用 os.path.expanduser(path)

On Unix and Windows, return the argument with an initial component of ~ or ~user replaced by that user‘s home directory.

您还应确保将命令的每个部分分开。

常见的做法是使用 str.split() 并将其作为参数列表发送:

subprocess.call(
    "some command with arguments".split()
)

对您的代码应用波浪号扩展:

subprocess.call(
    ['tool', '-o', os.path.expanduser('~/output'), args.filelocation]
)