2009-04-14 10 views
5

Tengo un simple script en Python, así:Pasar una cadena de múltiples líneas como argumento para una secuencia de comandos en Windows

import sys 

lines = sys.argv[1] 

for line in lines.splitlines(): 
    print line 

quiero llamarlo desde la línea de comandos (o un archivo .bat), pero el primer argumento puede (y probablemente será) una cadena con múltiples líneas. ¿Cómo hace uno esto?

Por supuesto, esto funciona:

import sys 

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

for line in lines.splitlines(): 
    print line 

Pero tengo que ser capaz de procesar una línea de línea por argumento.

EDITAR: Esto es probablemente más un problema de línea de comandos de Windows que un problema de Python.

EDIT 2: Gracias por todas las buenas sugerencias. No parece que sea posible. No puedo usar otro intérprete de órdenes porque estoy intentando invocar el guión desde otro programa que parece usar la línea de comandos de Windows detrás de escena.

+0

No entiendo - ¿lo que tienes ahora no funciona? –

+0

Debe dividir por "\ n" de antemano y eliminar la "\ r" de antemano para una mejor compatibilidad de la plataforma. ¿'Bash' put carraige regresa en sus argumentos? (No es seguro). –

+0

No debe usar el módulo de cadena en absoluto. Esa línea debería leer 'lines = multiline.splitlines()' –

Respuesta

2

Sólo adjuntar el argumento entre comillas:

$ 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 
+0

¿Se puede hacer esto desde la línea de comandos de Windows? –

+0

Aparentemente no ... – skrebbel

0

No estoy seguro sobre la línea de comandos de Windows, sino que el siguiente trabajo?

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

..o ..

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

Si no es así, sugeriría la instalación de Cygwin y el uso de una concha sano!

+0

Ninguno. En primer lugar, cmd no usa \ como carácter de escape, sino que usa ^. En segundo lugar,^n produciría literalmente n, ya que^solo se puede usar para escapar caracteres especiales pero no tiene la capacidad de generar caracteres especiales, como \ n, \ r, etc. – Joey

1

El siguiente podría funcionar:

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

Esto me permite atravesar efectivamente mi cadena a través varias líneas, pero todavía termina sin los caracteres "nueva línea" en la cadena. –

+1

Las líneas vacías son importantes en este caso. Al menos funcionó para que echo emitiera varias líneas, pero no pude probar aquí de otra manera en este momento. Si todo lo demás falla, use la solución de tubería que otros sugirieron. Pasar varias líneas a través de stdin no es un problema, al menos. – Joey

0

¿Ha intentado establecer texto de varias líneas como una variable y luego pasando la expansión de eso en su guión. Por ejemplo:

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

Como alternativa, en lugar de leer un argumento que se podía leer desde la entrada estándar

import sys 

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

En Linux que lo haría el tubo de texto de varias líneas a la entrada estándar de args.py..

$ < command-that-produce-text > | pitón args.py

+0

Parece que no funciona en absoluto. No directamente desde la línea de comandos de Windows, y no desde un archivo por lotes. – skrebbel

1

Esto es lo único que funcionó para mí:

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

Para mí Johannes' solution invoca el intérprete de Python al final de la primera línea, por lo que no tienen la oportunidad de pasar líneas adicionales

Pero dijiste que llamabas al script de python desde otro proceso, no desde la línea de comandos. Entonces, ¿por qué no usas dbr' solution? Esto funcionó para mí como un script Ruby:

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

idioma y está escribiendo el programa que llama al script en Python?El problema que tengo es con argumento que pasa, no con el shell de Windows, no con Python ...

Por último, como mattkemp Dicho esto, yo también sugerimos que use la entrada estándar para leer su argumento de varias líneas, evitando línea de comando mágico.

2

Sé que este hilo es bastante viejo, pero lo encontré al tratar de resolver un problema similar, y otros podrían serlo, así que déjame mostrarte cómo lo resolví.

Esto funciona, al menos en Windows XP Pro, con el código de Zack en un archivo llamado
"C: \ arañazos \ 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> 

Esto es un poco más legible que la solución de Rómulo anteriormente .

Cuestiones relacionadas