Я пытаюсь передать аргумент командной строки с пробелом, но sys.argv[1].strip() дает мне только первое слово аргумента

import sys, os
docname = sys.argv[1].strip()

 e.g. $ python myscript.py argument with whitespace

Если я пытаюсь отладить - docname выдает мне вывод argument вместо argument with whitespace

Я пытался заменить пробел методом .replace(" ","%20"), но это не помогло

2
Darshan Deshmukh 13 Дек 2016 в 19:02

4 ответа

Лучший ответ

Это не имеет ничего общего с Python и все, что связано с оболочкой. В оболочке есть функция разделение слов , которая делает каждое слово в вашем вызове команды отдельное слово или арг. Чтобы передать результат в Python как одно слово с пробелами в нем, вы должны либо экранировать пробелы, либо использовать кавычки.

./myscript.py 'argument with whitespace'
./myscript.py argument\ with\ whitespace

Другими словами, к тому времени, когда ваши аргументы попадают в Python, разделение слов уже выполнено, неэкранированный пробел удален и sys.argv (в основном) представляет собой список слов.

13
kojiro 13 Дек 2016 в 16:06

Использование строк в командной строке

Вы можете использовать строковый литерал в двойных кавычках в командной строке. подобно

python myscript.py "argument with whitespace"

Остальное:

python myscript.py argument with whitespace

Использование обратной косой черты

Здесь вы также можете использовать обратную косую черту:

python myscript.py argument\ with\ whitespace\
1
Jaidee 17 Янв 2019 в 12:55

Попробуйте это с помощью argparse:

#!/usr/bin/env python3

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-f", "--file",
                    help="specify the file to be used (enclose in double-quotes if necessary)",
                    type=str)
args = parser.parse_args()

if args.file:
    print("The file requested is:", args.file)

Результаты:

$ ./ex_filename.py --help
usage: ex_filename.py [-h] [-f FILE]

optional arguments:
  -h, --help            show this help message and exit
  -f FILE, --file FILE  specify the file to be used (enclose in double-quotes
                        if necessary)

$ ./ex_filename.py -f "~/testfiles/file with whitespace.txt"
The file requested is: ~/testfiles/file with whitespace.txt
$ 

Обратите внимание, что -h / --help приходит "бесплатно".

0
DeanM 28 Дек 2018 в 19:32

Вам нужно использовать argv[1:] вместо argv[1]:

docname = sys.argv[1:]

Чтобы напечатать это как строку:

' '.join(sys.argv[1:])  # Output: argument with whitespace

sys.argv[0] - это имя самого скрипта, а sys.argv[1:] - список всех аргументов, переданных вашему скрипту.

< Сильный > Вывод :

>>> python myscript.py argument with whitespace
['argument', 'with', 'whitespace']
1
ettanany 13 Дек 2016 в 16:15