2015-05-29 88 views
0

在這種情況下,如何找出文件的基本名稱?Python os.path.basename,strip參數

>>> from os.path import basename 
>>> basename('C:\\test.exe --help') 
'test.exe --help' 

結果應該只是test.exe沒有--help或任何其他參數。

+0

'重。 match(r'(。*?)\ s-',basename('C:\\ test.exe --help'))。group(1)' –

+0

這是什麼用法?既然你用參數輸入你的命令,你也可以不輸入參數,以便基本名稱按預期工作。否則,請解釋你的python程序如何得到這個命令的參數?使用basename-regular-expression雜技是一種跡象,可以使其他地方變得更簡單。 – dopstar

+0

用戶指定一個命令(給定的字符串),我用'subprocess.Popen'運行它。另外,我想將執行文件的名稱('test.exe')記錄到日誌中(類似「成功稱爲test.exe」)。該解決方案應該可以處理'subprocess.Popen'可以處理的任何可能的輸入。 – fnkr

回答

1

shlex模塊,一個的Unix外殼的模仿行爲(但由於command.com用來模仿它的一些功能,它應該工作太)。它也將不會容忍一個引號(但請注意,我用原始字符串例子):

>>> import shlex 
>>> print shlex.split(r'C:\\test.exe --help') 
['C:\\test.exe', '--help'] 
>>> print shlex.split(r'"C:\\test.exe" --help') 
['C:\\test.exe', '--help'] 
>>> print shlex.split(r'"C:\\Program Files\\test.exe" --help') 
['C:\\Program Files\\test.exe', '--help'] 

因此,需要從shlex.split返回第一個字符串,並傳遞給基名。

如果你想擺脫治療反斜槓\爲轉義序列,你應該建立明確shlex對象:

>>> from shlex import shlex 
>>> lex = shlex('C:\\test.exe --help') 
>>> lex.whitespace_split = True 
>>> lex.escape = '' 
>>> list(lex) 
['C:\\test.exe', '--help'] 
0
import os, shlex 
print(os.path.basename(shlex.split(r'"C:\\test.exe" --help')[0])) 
+0

這將返回當前文件的基本名稱,但不是'C:\\ test.exe --help'。 – fnkr

+0

現在請驗證並將其標爲正面。 – csharpcoder

0

那麼問題是,至少在Linux上,「test.exe的--exe '是一個有效的文件名。所以這就是爲什麼python不會嘗試從'參數'中清除文件名的原因。我看着windows docs,它看起來像你也使文件名爲'test.exe --exe'。所以,這取決於你想要達到的目標。

也看看這個:What is the most correct regular expression for a UNIX file path?

那麼你或許應該檢查文件是否存在,如果它不然後使用正則表達式或shlex模塊剝去參數...

+0

這不完全正確。 'test.exe --exe'在Windows上也是一個有效的文件名。在Linux和Windows上運行'test.exe --exe'將會打開'test.exe'而不是'test.exe --exe',除非你引用或轉義它。在這一點上,Windows和Linux沒有區別。我發現的唯一區別是'test.exe/test'('test.exe'和'/ test'之間沒有空格)會在Windows上調用'test.exe'作爲參數,而不是在Linux上調用'test.exe',但是我認爲這種情況在我的情況下很難忽略。 – fnkr

+0

test.exe \ --exe會在bash中被認爲是文件名,test.exe --exe不會。 –

+0

就像我說的,escape('test.exe \ --exe')或者引號('「test.exe --exe」')。 – fnkr