Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 17, 2010 12:35:14

pikhovkin
От:
Зарегистрирован: 2010-10-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

sys.argv и многословные аргументы

Здравствуйте!
Не подскажете, есть ли какой-нибудь модуль для разбора многословных аргументов, которые передаются программе из командной строки?
Или такой велосипед пойдет? :)

import sys

sys_argvs = ['command', 'name']
sys_argv = {'command': '', 'name': ''}

argv = sys.argv[1:]

i = int(-1)
for param in argv:
if param[:2] == '--':
i += 1
sys_argv[sys_argvs[i]] = param[2:].decode('cp1251')
else:
sys_argv[sys_argvs[i]] += ' ' + param.decode('cp1251')

print('command={0}'.format(sys_argv['command']))
print('name={0}'.format(sys_argv['name'].encode('cp866')))
Windows, python 2.6
Пример: python sys_argv.py –add –Многословный аргумент



Отредактировано (Дек. 17, 2010 12:48:14)

Офлайн

#2 Дек. 17, 2010 13:59:02

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

sys.argv и многословные аргументы

С вашей задачей легко справляется getopt

import sys
import getopt
opts, args = getopt.getopt(sys.argv[1:], "hd:ao:", ["multi world", "scala_dir=","all","output="])
print opts
Далее можно посмотреть optparce
Что касается национальных кодировок то getopt тоже прекрасно справляется.
Но мой опыт таков что не было случая чтобы использование в путях или ключах русских букв пробелов и прочей ерунды не приводило к крикам что система не работает. Это будет не обязательно у вас, но кто-нибудь что-нибудь перепутает в кодировках кавычках и т.п.



Отредактировано (Дек. 17, 2010 14:05:49)

Офлайн

#3 Дек. 17, 2010 14:12:55

pikhovkin
От:
Зарегистрирован: 2010-10-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

sys.argv и многословные аргументы

Ваш пример выводит пустой список.



Офлайн

#4 Дек. 17, 2010 14:24:15

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

sys.argv и многословные аргументы

О чем я и говорю - вы в командной строке кавычки поставили?



Офлайн

#5 Дек. 17, 2010 14:32:54

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

sys.argv и многословные аргументы

python a.py –“multi world”
C:\PROJECTS\ECRAN\utils\aaa>python a.py –“multi world”


У меня получается так. Если не секрет поделитесь в чем задача. Может найдется более красивое решение. Пользователи обычно не очень умеют пользоваться командной строкой и делают это сильно по разному - с cmd кидая файлы в эксплорере на ваше приложение, делая программные вызовы system, пишут командные файлы, и т.п. Этот процесс трудно контролировать.



Отредактировано (Дек. 17, 2010 14:33:54)

Офлайн

#6 Дек. 17, 2010 14:53:35

pikhovkin
От:
Зарегистрирован: 2010-10-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

sys.argv и многословные аргументы

Первый раз я запустил ваш пример как он был, он выдал пустой список :)
Потом посмотрел сам модуль и разобрался что и как.

Задача самая простая: получить начальные данные в программу :)
Один или два аргумента могут содержать русские символы. Программа будет работать на линукс.
С линукс не работал, но слышал, что там все в утф-8 и тогда проблем с кодировкой не возникнет, верно ли?

В принципе, мой код тоже подойдет, чтобы не тянуть еще один модуль. (как раз и от кавычек избавлюсь :))
Спасибо за ответ!



Отредактировано (Дек. 17, 2010 14:54:56)

Офлайн

#7 Дек. 17, 2010 15:11:09

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

sys.argv и многословные аргументы

1 Не советую полагаться на то, что кто-то сказал что там все будет в UTF8 тем более если вы не видели систему. Может получиться даже хуже чем с windows.
2 Еще один модуль никого не напряжет. В нормальных программах они импортируются десятками.
3 Избавление от кавычек введет в заблуждение всех пользователей unix и не только их. Такая форма будет восприниматься ими как ключ и параметр программы.
4 обычный путь получения данных stdin но если он у вас занят или им пользоваться не удобно, то для передачи аргументов которые должен редактировать пользователь наверное лучше использовать что-то такое

import ConfigParser
config = ConfigParser.ConfigParser()
config.read(['xxx.xxx'])
Когда данные с русским языком в файле, гораздо проще контролировать кодировку комментировать параметры и т.п. Формат файла стандартный.
Многие еще любят передачу данных в xml, я правда не люблю.



Отредактировано (Дек. 17, 2010 15:11:39)

Офлайн

#8 Дек. 17, 2010 15:17:42

pikhovkin
От:
Зарегистрирован: 2010-10-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

sys.argv и многословные аргументы

Убедили :)
Спасибо!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version