2015-03-02 56 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