Передача многострочной строки в качестве аргумента скрипту в Windows - PullRequest
5 голосов
/ 14 апреля 2009

У меня есть простой скрипт на Python, например:

import sys

lines = sys.argv[1]

for line in lines.splitlines():
    print line

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

Конечно, это работает:

import sys

lines = """This is a string
It has multiple lines
there are three total"""

for line in lines.splitlines():
    print line

Но мне нужно уметь обрабатывать аргумент построчно.

РЕДАКТИРОВАТЬ: Это, вероятно, больше проблема командной строки Windows, чем проблема Python.

РЕДАКТИРОВАТЬ 2: Спасибо за все хорошие предложения. Не похоже, что это возможно. Я не могу использовать другую оболочку, потому что я на самом деле пытаюсь вызвать скрипт из другой программы, которая, кажется, использует закулисную командную строку Windows.

Ответы [ 6 ]

2 голосов
/ 08 мая 2010

Я знаю, что эта ветка довольно старая, но я сталкивался с ней, пытаясь решить аналогичную проблему, и другие тоже могут, поэтому позвольте мне показать вам, как я ее решил.

Это работает, по крайней мере, в Windows XP Pro с кодом Зака ​​в файле с именем
"C: \ Царапины \ test.py":

C:\Scratch>test.py "This is a string"^
More?
More? "It has multiple lines"^
More?
More? "There are three total"
This is a string
It has multiple lines
There are three total

C:\Scratch>

Это немного более читабельно, чем решение Ромуло выше.

2 голосов
/ 14 апреля 2009

Просто заключите аргумент в кавычки:

$ python args.py "This is a string
> It has multiple lines
> there are three total"
This is a string
It has multiple lines
there are three total
1 голос
/ 16 апреля 2009

Это единственное, что сработало для меня:

C:\> python a.py This" "is" "a" "string^
More?
More? It" "has" "multiple" "lines^
More?
More? There" "are" "three" "total

Для меня Решение Йоханнеса вызывает интерпретатор python в конце первой строки, поэтому у меня нет возможности пропустить дополнительные строки.

Но вы сказали, что вызываете скрипт python из другого процесса, а не из командной строки. Тогда почему бы вам не использовать dbr 'решение ? Это работает для меня как скрипт на Ruby:

puts `python a.py "This is a string\nIt has multiple lines\nThere are three total"`

А на каком языке вы пишете программу, которая вызывает скрипт python? У вас проблема с передачей аргументов , а не с оболочкой Windows, не с Python ...

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

1 голос
/ 15 апреля 2009

Может работать следующее:

C:\> python something.py "This is a string^
More?
More? It has multiple lines^
More?
More? There are three total"
0 голосов
/ 15 апреля 2009

Вы пытались установить многострочный текст в качестве переменной и затем передать его в свой сценарий. Например:

set Text="This is a string
It has multiple lines
there are three total"
python args.py %Text%

В качестве альтернативы, вместо чтения аргумента вы можете прочитать из стандартного в.

import sys

for line in iter(sys.stdin.readline, ''):
    print line

В Linux вы должны передать многострочный текст на стандартный ввод args.py.

$ <команда-что-производит-текст> | python args.py

0 голосов
/ 15 апреля 2009

Не уверен насчет командной строки Windows, но будет ли работать следующее?

> python myscript.py "This is a string\nIt has multiple lines\there are three total"

.. или ..

> python myscript.py "This is a string\
It has [...]\
there are [...]"

Если нет, я бы предложил установить Cygwin и использовать нормальную оболочку!

...