Необходимо передать аргумент из sys.argv [1] в качестве входных данных для glob () в python - PullRequest
0 голосов
/ 09 мая 2020

У меня ситуация, когда мне нужно взять аргумент из командной строки и использовать эту строку (выражение), которая мне нужна для печати файлов на основе этого регулярного выражения. Я хочу использовать glob для анализа моей строки, поскольку я могу передать регулярное выражение для фильтрации. выдержка из python файла:

dated = sys.argv[1]
files = glob.glob(dated)

Это выдает мне пустой список

> python analysis.py <some_expression>
[]

Однако, если я даю какое-либо значение вручную:

dated = '*.xlsx' # example sake
files = glob.glob(dated)
print(files)

он печатает :

[<list of files conforming to the required filter>]

Очевидно, что аргументы CLI, которые он печатает выше, но я хочу, чтобы аргумент CLI работал правильно.

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

любые идеи, если я где-то что-то упускаю?

Ответы [ 2 ]

2 голосов
/ 09 мая 2020

Если приведенный ниже код работает,

dated = '*.xlsx' # example sake
files = glob.glob(dated)
print(files)

и sys.argv[1] нет; попробуйте сравнить dated и sys.argv[1].

Вероятно, вам что-то не хватает.

0 голосов
/ 09 мая 2020

Проблема не в Python, а в оболочке, которая его вызывает. Большинство известных мне оболочек (определенно все оболочки Linux) выполняют расширение глобуса перед передачей аргументов исполняемому файлу, который они порождают (в данном случае ваш сценарий Python). Это означает, что самое большее sys.argv[1] будет содержать первый файл, соответствующий переданному вами выражению glob, и в любом случае применение glob к нему не принесет никакой пользы.

Например, если ваш рабочий каталог имеет файлы a.xlsx, b.xlsx и c.xlsx, и вы вызываете свой код, используя:

python mycode.py *.xlsx

Тогда оболочка будет фактически glob аргументом, который вы указали, и передаст результаты вашему script, что делает следующее истинным:

sys.argv[1:] == [`a.xlsx`, `b.xlsx`, `c.xlsx`]

Фактически, вместо того, чтобы явно вызывать glob, вы можете просто перебирать sys.argv[1:].

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