Python子流程模块:";无法创建目录";

Python子流程模块:";无法创建目录";,python,subprocess,argparse,Python,Subprocess,Argparse,我有一个Python脚本,它使用“Argparser”从命令行接收参数。这是我指定特定文件的位置的地方。然后,调用安装在我的设备上的另一个命令行工具,并将文件的这个位置传递给该工具。要正常工作,该工具需要创建一个输出目录 现在,我的问题是该工具本身在我指定的位置创建输出目录没有问题。例如:#tool-o~/output filelocation'使工具从filelocation读取文件,并在我的主文件夹中创建一个名为“output”的目录来存储结果。但是,当我在Python中使用subproce

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

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

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

无法生成目录~/output

我以root权限运行所有这些。我不知道为什么通过子流程模块调用此“工具”时无法创建目录。任何帮助都将不胜感激

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

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

无法创建目录/root/bulk


~/
由您的shell扩展,而您的调用中不使用shell。尝试使用绝对路径,如此处的
/home/myuser/output
。作为一种替代方法,使用
shell=True
可能会有所帮助,但这确实很危险,因为所有环境变量等都被使用了

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

如果需要使用
~
的选项,可以使用

在Unix和Windows上,返回参数时,初始组件~or~ user被该用户的主目录替换

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

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

subprocess.call(
    "some command with arguments".split()
)
将波浪式展开应用于代码:

subprocess.call(
    ['tool', '-o', os.path.expanduser('~/output'), args.filelocation]
)
如果需要使用
~
的选项,可以使用

在Unix和Windows上,返回参数时,初始组件~or~ user被该用户的主目录替换

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

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

subprocess.call(
    "some command with arguments".split()
)
将波浪式展开应用于代码:

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


如果您使用
shell=True
,它是否有效?此外,您应该像这样构造参数:
['tool'、'-o'、'~/output',args.filelocation]
。由空格分隔的所有内容都应该是命令列表中的新元素。这可能就是问题所在。拥有root权限(不一定)与拥有
root
相同。错误消息与代码不对应。发布实际代码和完整的回溯。如果使用
shell=True
,是否有效?此外,您应该像这样构造参数:
['tool','-o','~/output',args.filelocation]
。由空格分隔的所有内容都应该是命令列表中的新元素。这可能就是问题所在。拥有root权限(不一定)与拥有
root
相同。错误消息与代码不对应。发布实际代码和完整的回溯。我也是这么想的。所以我尝试使用绝对路径;这是同样的错误:“无法生成目录/root/output”这也是我的想法。所以我尝试使用绝对路径;同样的错误:“无法生成目录/root/output”是的,这很有效!然而,当我使用像“/root/output”这样的绝对路径时,我不知道为什么它不起作用。如果你知道原因,请告诉我。@intellikid
os.path.expanduser('~/output')
给了你什么?阅读这里:@PeterWood使用os.path.expanduser('~/output'),我得到了“工具”的工作。它创建了输出文件夹并在那里提取结果。@intellikid是的,但值是多少?它与
/root/output
相同还是不同。这应该给你一个线索,为什么它以一种方式工作,而不是另一种方式。是的,这起作用了!然而,当我使用像“/root/output”这样的绝对路径时,我不知道为什么它不起作用。如果你知道原因,请告诉我。@intellikid
os.path.expanduser('~/output')
给了你什么?阅读这里:@PeterWood使用os.path.expanduser('~/output'),我得到了“工具”的工作。它创建了输出文件夹并在那里提取结果。@intellikid是的,但值是多少?它与
/root/output
相同还是不同。这应该给你一个线索,为什么它以一种方式工作,而不是另一种方式。