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]
)
我有一个 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]
)