Passing a multi-line string as an argument to a script in Windows

∥☆過路亽.° 提交于 2020-01-01 05:14:13

问题


I have a simple python script like so:

import sys

lines = sys.argv[1]

for line in lines.splitlines():
    print line

I want to call it from the command line (or a .bat file) but the first argument may (and probably will) be a string with multiple lines in it. How does one do this?

Of course, this works:

import sys

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

for line in lines.splitlines():
    print line

But I need to be able to process an argument line-by-line.

EDIT: This is probably more of a Windows command-line problem than a Python problem.

EDIT 2: Thanks for all of the good suggestions. It doesn't look like it's possible. I can't use another shell because I'm actually trying to invoke the script from another program which seems to use the Windows command-line behind the scenes.


回答1:


I know this thread is pretty old, but I came across it while trying to solve a similar problem, and others might as well, so let me show you how I solved it.

This works at least on Windows XP Pro, with Zack's code in a file called
"C:\Scratch\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>

This is a little more readable than Romulo's solution above.




回答2:


Just enclose the argument in quotes:

$ 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



回答3:


The following might work:

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



回答4:


This is the only thing which worked for me:

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

For me Johannes' solution invokes the python interpreter at the end of the first line, so I don't have the chance to pass additional lines.

But you said you are calling the python script from another process, not from the command line. Then why don't you use dbr' solution? This worked for me as a Ruby script:

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

And in what language are you writing the program which calls the python script? The issue you have is with argument passing, not with the windows shell, not with Python...

Finally, as mattkemp said, I also suggest you use the standard input to read your multi-line argument, avoiding command line magic.




回答5:


Not sure about the Windows command-line, but would the following work?

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

..or..

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

If not, I would suggest installing Cygwin and using a sane shell!




回答6:


Have you tried setting you multiline text as a variable and then passing the expansion of that into your script. For example:

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

Alternatively, instead of reading an argument you could read from standard in.

import sys

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

On Linux you would pipe the multiline text to the standard input of args.py.

$ <command-that-produces-text> | python args.py



来源:https://stackoverflow.com/questions/749049/passing-a-multi-line-string-as-an-argument-to-a-script-in-windows

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!