2015-05-29 4 views
0

Как определить базовое имя файла в этом случае?Python os.path.basename, параметры полосы

>>> 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 acrobatics является признаком того, что что-то можно упростить в другом месте. – 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. Запуск 'test.exe --exe' как в Linux, так и в Windows откроет' test.exe' не 'test.exe --exe', если вы не процитируете или не убедите его. На данный момент нет разницы между Windows и Linux. Единственное различие, которое я обнаружил, заключается в том, что 'test.exe/test' (без пробелов между' test.exe' и '/ test') будет вызывать' test.exe' с '/ test' как аргумент в Windows, но не в Linux, однако я думаю, что это случается достаточно редко, чтобы игнорировать его в моем случае. – fnkr

+0

test.exe \ --exe будет считаться именем файла в bash, test.exe --exe не будет. –

+0

Как я уже сказал, сбегите ('test.exe \ --exe') или quote (' "test.exe --exe"). – fnkr