аргументы разбираются по разному в pycharm и console - PullRequest
0 голосов
/ 01 октября 2018

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

def main():
    """
    Main function
    """
    for i, arg in enumerate(sys.argv):
        print('Arg#{}: {}'.format(i, arg))

Если я запускаю ту же функцию:

python3 argumnents_tester.py 'argument 1' argument2

Выполнить в PyCharm :

Arg # 0: /home/gorfanidis/PycharmProjects/test1/argparse_test.py
Arg # 1: аргумент
Arg # 2: 1 '
Arg # 3: аргумент2

Запуск в Консоль :

Arg # 0: argparse_test.py
Arg# 1: аргумент 1
Аргумент # 2: аргумент2

Итак, PyCharm вообще игнорирует кавычки и разбивает аргументы, используя пробелы независимо от кавычек.Кроме того, аргументы с кавычками обрабатываются иначе, чем те же аргументы без кавычек.

Вопрос в том, почему это происходит, и на практическом уровне, как я могу передать аргумент, содержащий пробелы, используя, например, PyCharm?

Кстати, я пользуюсь Ubuntu 16.04.

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Отказ от ответственности: то, что оказалось правильным решением вопроса @Eypros, было мимолетным подозрением, что существует разница между тем, как PyCharm реализует анализ своих аргументов при запуске командной строки, и тем, как действительная системная консоль /shell ведет себя, на что также указал @guidot в своем ответе.Я приведу больше мыслей в Postscript ниже .

Чтобы обойти поведение, демонстрируемое PyCharm в том, как он интерпретирует часть argument 1 в python3 argumnents_tester.py 'argument 1' argument2 (как 2 аргумента ), используйте в коде другой тип кавычек, двойнойкавычка " для str.format() и одиночная кавычка ' для аргумента в команде запуска.

PS :
Хотя это выглядит как простой обходной путь, ядумаю, что в случае любой возможности выполнения кода в любой другой системе следует придерживаться наиболее распространенного / общепринятого стандартного поведения системных оболочек ( bash, zsh, sh , любых * nix-разновидностей)) в интерпретации аргумента, передаваемого вместо реализации PyCharm.Таким образом, код будет намного более переносимым, и пользователям не придется искать другой способ передачи / подачи аргумента.
Вследствие этого я не даю никаких гарантий, что это будет работать помимо этого конкретного способа, которым кодсформулированы и в конфигурации, аналогичной системе @Eypros.

0 голосов
/ 29 октября 2018

(Справочная информация) Ну, мне показалось, что оригинальный комментарий от @cryptonome сработал, но поскольку предоставленный тем же пользователем ответ не совсем совпадает, я резюмировал решение, которое работало для меня.

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

В PyCharm следует избегать одинарных кавычек, но, похоже, они работают в консоли (по крайней мере, в моем: bash *)1014 * в Убунуте 16.04), потому что разбиение аргумента происходит в пробелах, а не в кавычках.

0 голосов
/ 01 октября 2018

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

Если вы настаиваете на запуске этого из pycharm, я бы предложил другой способ передачи (например, через файл) или применить некоторый механизм удаления кавычек как urllib.parse.unquote.

См. Также здесь для датированного, но все еще правильного описания параметров командной строки в целом, а именно:

Стандарт ANSI C не определяет, чтопредставляет собой аргумент командной строки, потому что операционные системы значительно различаются по этому вопросу.Однако наиболее распространенным соглашением является следующее:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...