2015-03-02 55 views
1

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

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

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

这导致:

Could not make directory ~/output

我运行所有这一切都以root权限。我不知道为什么这个'工具'不能通过子进程模块调用时创建一个目录。任何帮助,将不胜感激。

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

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

结果:

Could not make directory /root/bulk

+0

它的工作原理=真'? – SethMMorton 2015-03-02 15:57:12

+0

另外,你应该像这样构造参数:'['tool','-o','〜/ output',args.filelocation]'。所有以空格隔开的内容都应该是命令列表中的新元素。这可能是问题所在。 – SethMMorton 2015-03-02 15:58:29

+0

拥有root权限并非(必然)与“root”相同。 – 2015-03-02 16:14:45

回答

3

如果您想要使用~的选项,您可以使用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] 
) 
+0

是的,这工作!但是,我不确定为什么当我使用像/ root/output这样的绝对路径时它不工作。如果你知道原因,请告诉我。 – learnerX 2015-03-02 16:09:50

+0

@intellikid os.path.expanduser('〜/ output')'给你什么? – 2015-03-02 16:11:50

+0

阅读这里:https://docs.python.org/2/library/subprocess.html#frequently-used-arguments – 2015-03-02 16:13:50

1

~/是由你的shell,这是不是您的呼叫使用扩展。尝试在此处使用像/home/myuser/output这样的绝对路径。作为替代使用shell=True可能会有所帮助,但这是非常危险的,因为所有的环境变量等都被使用了。

+0

这就是我的想法。所以我尝试使用绝对路径;这是相同的错误:“无法使目录/根/输出” – learnerX 2015-03-02 16:03:08