Полная командная строка, поскольку это было введено

Вот мой вариант, предполагая, что период задается датами start и end

let quarter: TimeInterval = 15 * 60
let dateInterval = DateInterval(start: start, end: end)

var date = start
var result = [Date]()
while dateInterval.contains(date) {
    result.append(date)
    date = date.addingTimeInterval(quarter)
}
.
31
задан Peter Mortensen 10 September 2018 в 21:03
поделиться

6 ответов

Вы слишком опаздываете. К тому времени, когда введенная команда добирается до Python, Ваша оболочка уже работала свое волшебство. Например, кавычки используются (как Вы заметили), переменные интерполированы, и т.д.

28
ответ дан Martin Carpenter 27 November 2019 в 22:15
поделиться

В среде Unix это не обычно возможно... лучшее, на которое можно надеяться, командная строка, как передано процессу.

, поскольку оболочка (по существу любой оболочка) может munge введенная командная строка несколькими способами прежде, чем вручить его ОС для выполнения.

13
ответ дан Peter Mortensen 27 November 2019 в 22:15
поделиться

Взгляд *nix

начальное расположение стека (Linux на i386), который обеспечивает доступ к командной строке и среде программы : процесс видит только отдельные аргументы.

Вы не можете получить командную строку , поскольку она была введена в общем случае. На Unix оболочка анализирует командную строку в отдельные аргументы и в конечном счете execv(path, argv) функция, которая вызывает соответствующий syscall, назван. sys.argv получен от argv, параметр передал эти execve() функция. Вы могли получить что-то эквивалентное использование " ".join(map(pipes.quote, argv)), хотя Вы не должны должны быть, например, если Вы хотите перезапустить сценарий с немного отличающимися параметрами командной строки тогда sys.argv, достаточно ( во многих случаях ), см. , это возможный установить Python-O (оптимизируют) флаг в рамках сценария?

существуют некоторые творческие (непрактические) решения:

  • присоединяют оболочку с помощью gdb и опрашивают его (большинство оболочек способно к повторению той же команды дважды), —, необходимо быть в состоянии получить почти ту же команду, как это был typed—, или считайте его файл истории непосредственно, если это обновляется перед выходами процесса
  • экран использования, утилиты сценария для получения терминального сеанса
  • используют клавиатурный перехватчик, для получения то, что было введено.

Windows

On Windows собственный компонент CreateProcess() интерфейс является строкой, но python.exe все еще получает аргументы как список. subprocess.list2cmdline(sys.argv) мог бы помочь инвертировать процесс. list2cmdline разработан для приложений с помощью [1 116] те же правила в качестве MS C время выполнения , — python.exe является одним из них. list2cmdline не возвращает командную строку , поскольку она была введена , но она возвращает функциональный эквивалент в этом случае.

На Python 2, Вам, возможно, понадобилось бы GetCommandLineW() , для получения символов Unicode от командной строки, которая не может быть представлена в кодовой странице Windows ANSI (такой как cp1252).

10
ответ дан Community 27 November 2019 в 22:15
поделиться

Как упомянуто, это, вероятно, не может быть сделано, по крайней мере, не надежно. В нескольких случаях Вы могли бы быть в состоянии найти файл истории для оболочки (например, - "удар", но не "tcsh") и получить ввод пользователя от этого. Я не знаю, сколько, если таковые имеются, управление Вы имеете по среде пользователя.

5
ответ дан Roboprog 27 November 2019 в 22:15
поделиться

Если бы Вы находитесь на Linux, я предложил бы monkeying с ~/.bash_history файл или оболочка history команда, хотя я полагаю, что команда должна закончить выполняться, прежде чем это будет добавлено к истории оболочки.

я начал играть с:

import popen2
x,y = popen2.popen4("tail ~/.bash_history")
print x.readlines()

, Но я становлюсь странным поведение, где оболочка, кажется, полностью не сбрасывает к .bash_history файл.

1
ответ дан Peter Mortensen 27 November 2019 в 22:15
поделиться

На Linux существует /proc/<pid>/cmdline, который находится в формате argv[] (т.е. существует 0x00 между всеми строками, и Вы не можете действительно знать, сколько там - строки, так как Вы не получаете argc; хотя Вы будете знать это, когда файл исчерпает данные;).

можно быть уверены, что та командная строка уже портится также, так как все заполнение выхода/переменной сделано, и параметры приятно упаковываются (никакие дополнительные пространства между параметрами, и т.д.).

0
ответ дан Peter Mortensen 27 November 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: