Найти - Пользователи
Полная версия: sys.argv и многословные аргументы
Начало » Python для новичков » sys.argv и многословные аргументы
1
pikhovkin
Здравствуйте!
Не подскажете, есть ли какой-нибудь модуль для разбора многословных аргументов, которые передаются программе из командной строки?
Или такой велосипед пойдет? :)
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 –Многословный аргумент
doza_and
С вашей задачей легко справляется getopt
import sys
import getopt
opts, args = getopt.getopt(sys.argv[1:], "hd:ao:", ["multi world", "scala_dir=","all","output="])
print opts
Далее можно посмотреть optparce
Что касается национальных кодировок то getopt тоже прекрасно справляется.
Но мой опыт таков что не было случая чтобы использование в путях или ключах русских букв пробелов и прочей ерунды не приводило к крикам что система не работает. Это будет не обязательно у вас, но кто-нибудь что-нибудь перепутает в кодировках кавычках и т.п.
pikhovkin
Ваш пример выводит пустой список.
doza_and
О чем я и говорю - вы в командной строке кавычки поставили?
doza_and
python a.py –“multi world”
C:\PROJECTS\ECRAN\utils\aaa>python a.py –“multi world”


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

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

В принципе, мой код тоже подойдет, чтобы не тянуть еще один модуль. (как раз и от кавычек избавлюсь :))
Спасибо за ответ!
doza_and
1 Не советую полагаться на то, что кто-то сказал что там все будет в UTF8 тем более если вы не видели систему. Может получиться даже хуже чем с windows.
2 Еще один модуль никого не напряжет. В нормальных программах они импортируются десятками.
3 Избавление от кавычек введет в заблуждение всех пользователей unix и не только их. Такая форма будет восприниматься ими как ключ и параметр программы.
4 обычный путь получения данных stdin но если он у вас занят или им пользоваться не удобно, то для передачи аргументов которые должен редактировать пользователь наверное лучше использовать что-то такое
import ConfigParser
config = ConfigParser.ConfigParser()
config.read(['xxx.xxx'])
Когда данные с русским языком в файле, гораздо проще контролировать кодировку комментировать параметры и т.п. Формат файла стандартный.
Многие еще любят передачу данных в xml, я правда не люблю.
pikhovkin
Убедили :)
Спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB