Я хочу получить полную командную строку по мере ее ввода.
Это:
" ".join(sys.argv[:])
здесь не работает (удаляет двойные кавычки). Также я предпочитаю не присоединяться к чему-то, что было разобрано и расколото.
Любые идеи?
Спасибо заранее.
Я хочу получить полную командную строку по мере ее ввода.
Это:
" ".join(sys.argv[:])
здесь не работает (удаляет двойные кавычки). Также я предпочитаю не присоединяться к чему-то, что было разобрано и расколото.
Любые идеи?
Спасибо заранее.
Ты опоздал. К тому времени, когда введенная команда попадет на Python, ваша оболочка уже поработала над своей магией. Например, кавычки потребляются (как вы заметили), переменные получают интерполяцию и т.д.
В среде unix это, как правило, невозможно... лучше всего вы можете надеяться, это командная строка, переданная вашему процессу.
Поскольку оболочка (по существу, любая оболочка) может несколько раз набить введенную командную строку, прежде чем передать ее ОС для выполнения.
Посмотрите исходный макет стека (Linux на i386), который обеспечивает доступ к командной строке и среде программы: процесс видит только отдельные аргументы.
Вы не можете получить командную строку, как она была напечатана в общем случае. В Unix оболочка анализирует командную строку на отдельные аргументы и в конечном итоге вызывается execv(path, argv)
функция, которая вызывает соответствующий syscall. sys.argv
выводится из параметра argv
, переданного функции execve()
. Вы можете получить что-то эквивалентное, используя " ".join(map(pipes.quote, argv))
, хотя вам не нужно, например, перезапустить script с несколько отличающимися параметрами командной строки, тогда sys.argv
достаточно (во многих случаях), см. Можно ли установить флаг python -O (optimize) в script?
Есть несколько творческих (не практических) решений:
В Windows собственный CreateProcess()
интерфейс представляет собой строку, но python.exe по-прежнему получает аргументы в виде списка. subprocess.list2cmdline(sys.argv)
может помочь изменить процесс. list2cmdline
предназначен для приложений с использованием того же
как время выполнения MS C - python.exe
является одним из них. list2cmdline
не возвращает командную строку по мере ее ввода, но в этом случае возвращает функциональный эквивалент.
На Python 2 вам может понадобиться GetCommandLineW()
, чтобы получить символы Unicode из командной строки, которые не могут быть представлены в кодовой странице ANSI (например, cp1252).
Как уже упоминалось, это, вероятно, невозможно сделать, по крайней мере, не надежно. В некоторых случаях вы можете найти файл истории для оболочки (например, - "bash", но не "tcsh" ) и получить от пользователя текст. Я не знаю, сколько, если таковые имеются, контроля над пользовательской средой.
Если вы используете linux, я бы предложил обезьяну с командой ~/.bash_history или командой history, хотя я считаю, что команда должна завершить выполнение до того, как она добавится в историю оболочки.
Я начал играть с:
import popen2
x,y = popen2.popen4("tail ~/.bash_history")
print x.readlines()
но я получаю странное поведение, когда оболочка, похоже, полностью не сливается с файлом .bash_history
В linux есть /proc/<pid>/cmdline
, который находится в формате argv[]
(т.е. между всеми строками существует 0x00, и вы не можете действительно знать, сколько строк существует, так как вы не получаете argc; вы узнаете об этом, когда в файле закончились данные;).
Вы можете быть уверены, что эта командная строка уже запущена, так как все заполнение экскавации/переменной выполняется, а параметры - красиво упакованные (без лишних пробелов между параметрами и т.д.).