2017-07-18 23 views
0

我有一個項目,我把一個路徑作爲參數,並使用Tivoli Storage Manager(TSM),我執行該路徑樹的分段備份。 目前爲止這麼好。奇怪的行爲使用python3 subprocess.Popen和引號之間的參數

當我嘗試使用空格備份路徑時,我發現了一個奇怪的行爲。 當我使用TSM時,我將路徑放在引號中,並且工作正常。 另一方面,在python(3.5.2)上,當我嘗試使用subprocess.Popen執行命令時,tsm告訴我無法找到路徑。奇怪的行爲是將參數路徑與當前目錄連接起來。

一旦:它僅當處理具有空格的路徑,即, 「/ APPDATA/mtmradar/IXD /汽車ë的Ar/07_821_261_6 /」

我已經讀了一些問題等16114713 hapens。

順便說一下,我發現,當使用刪除引號列表時,我可以正確執行命令。 我的問題是:爲什麼它連接我的當前路徑與參數路徑?

我在AIX 7.2上使用Python 3.5.2。 完整的命令是這樣的:

>>> from subprocess import Popen 
>>> with Popen(['/usr/bin/dsmc', 'i', '-quiet', '-optfile=/usr/tivoli/tsm/client/ba/bin64/dsm-NAS-SDER00019.opt', '-sub=yes', '"/appdata/mtmradar/ixd/Autos e Ar/07_821_261_6/"']) as proc: 
...  pass 
... 

這是我的了:

IBM Tivoli Storage Manager 
Command Line Backup-Archive Client Interface 
    Client Version 7, Release 1, Level 3.0 
    Client date/time: 07/18/17 10:37:54 
(c) Copyright by IBM Corporation and other(s) 1990, 2015. All Rights Reserved. 

Node Name: NAS-SDER00019 
Session established with server CELBKP03: AIX 
    Server Version 7, Release 1, Level 4.100 
    Server date/time: 07/18/17 10:38:04 Last access: 07/18/17 10:27:03 


Incremental backup of volume '"/appdata/mtmradar/ixd/Autos e Ar/07_821_261_6/"' 
ANS1076E The specified directory path '/usr/tivoli/tsm/client/ba/bin64/tsm_seg_bkp_python/NAS-SDER00019/"/appdata/mtmradar/ixd/Autos\ e\ Ar/07_821_261_6/"' could not be found. 

執行相同的命令不帶路徑的雙引號,我沒有任何錯誤:

>>> with Popen(['/usr/bin/dsmc', 'i', '-quiet', '-optfile=/usr/tivoli/tsm/client/ba/bin64/dsm-NAS-SDER00019.opt', '-sub=no', '/appdata/mtmradar/ixd/Autos e Ar/07_821_261_6/']) as proc: 
...  pass 
... 

這是輸出:

IBM Tivoli Storage Manager 
Command Line Backup-Archive Client Interface 
[...] 
Incremental backup of volume '/appdata/mtmradar/ixd/Autos e Ar/07_821_261_6/' 
Successful incremental backup of '/appdata/mtmradar/ixd/Autos e Ar/07_821_261_6/*' 
Total number of objects inspected:   4 
[...] 
Total data reduction ratio:    100.00% 
Elapsed processing time:    00:00:01 
+0

定義個人時,不要使用引號中的相對路徑「subprocess.Popen」的參數 - 它會自動跳過你的參數,併爲其運行的shell定製。 – zwer

+0

謝謝,@ zwer。我明白那個。我唯一的dout是關於路徑字符串中的當前路徑。我期待着不同的東西,比如只是不瞭解空間。我甚至試圖逃避這些空間,比如'\',但它並沒有奏效。後來我發現問題是雙引號。 –

回答

0

歡迎來到引用字符串處理的天堂世界! ;-)

AIX是Unix,所以當你引用一個參數的命令,引號被shell解釋,並且外殼實際上引號傳遞參數通過(庫函數刪除到命令呼叫)execve。如果你想從Python中模擬它,當你將它們作爲迭代器傳遞時,你不會引用任何參數。如果這樣做,該命令將收到一個不是預期的帶引號的字符串。

該錯誤是由以雙引號"而不是斜槓/開頭的參數引起的。只有以斜槓開頭的路徑纔是絕對路徑,任何其他初始字符(包括")都會導致它被解釋爲相對路徑,因此是串聯。

所以回答你的問題是:因爲參數不以/開始,但有",它是串接到當前路徑

+0

這正是我想了解的。非常感謝! –