Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 23, 2014 21:54:49

serrrgggeee
Зарегистрирован: 2014-03-31
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

проверка при запуске программы python

Всем привет в общем такое дело уже перечитал много документации по python и все становится на свои места но вот сразу тупик есть такой участок кода

import os
import sys
import gtk
import time
import gobject
import traceback
from threading import Timer
from foobnix.fc.fc import FC
from foobnix.util import LOG, analytics
from foobnix.fc.fc_helper import CONFIG_DIR
def foobnix():
    if "--debug" in sys.argv:
        for param in sys.argv:
            if param.startswith("--log"):
                if "=" in param:
                    filepath = param[param.index("=")+1 : ]
                    if filepath.startswith('~'):
                        filepath = os.path.expanduser("~") + filepath[1 : ]
                else:
                    filepath = os.path.join(CONFIG_DIR, "foobnix.log")
                LOG.setup("debug", filename=filepath)
        else:
            LOG.setup("debug")
        LOG.print_platform_info()
    else:
        LOG.setup("error")
  
    from foobnix.regui.foobnix_core import FoobnixCore
    if "--test" in sys.argv:
        from test.all import run_all_tests
        print ("""TEST MODE""")
        result = run_all_tests(ignore="test_core")
        if not result:        
            raise SystemExit("Test failures are listed above.")
        exit()
    init_time = time.time()
    if "--nt" in sys.argv or os.name == 'nt':    
        gobject.threads_init() #@UndefinedVariable
        core = FoobnixCore(False)
        core.run()
        analytics.begin_session()
        print ("******Foobnix run in", time.time() - init_time, " seconds******")
        gtk.main()
    else:
        init_time = time.time() 
        from foobnix.regui.controls.dbus_manager import foobnix_dbus_interface
        iface = foobnix_dbus_interface()
        if "--debug" in sys.argv or not iface:
            print ("start program")
            gobject.threads_init()    #@UndefinedVariable
            core = FoobnixCore(True)
            core.run()
            analytics.begin_session()
            #core.dbus.parse_arguments(sys.argv)
            analytics.begin_session()
            print ("******Foobnix run in", time.time() - init_time, " seconds******")
            if sys.argv:
                Timer(1, gobject.idle_add, [core.check_for_media, sys.argv]).start()
            
            gtk.main()
        else:
            print (iface.parse_arguments(sys.argv))
if "--profile" in sys.argv:
    import cProfile
    cProfile.run('foobnix()')
else:    
    try:
        foobnix()
        analytics.end_session()
    except Exception, e:
        analytics.end_session()
        analytics.error("Main Exception"+str(e))
        exc_type, exc_value, exc_traceback = sys.exc_info()
        traceback.print_exception(exc_type, exc_value, exc_traceback, file=sys.stdout)
        FC().save()
я вижу что здесь в начале идет проверка вот взять этот участок
  if "--debug" in sys.argv:
        for param in sys.argv:
            if param.startswith("--log"):
                if "=" in param:
                    filepath = param[param.index("=")+1 : ]
                    if filepath.startswith('~'):
                        filepath = os.path.expanduser("~") + filepath[1 : ]
                else:
                    filepath = os.path.join(CONFIG_DIR, "foobnix.log")
                LOG.setup("debug", filename=filepath)
        else:
            LOG.setup("debug")
        LOG.print_platform_info()
    else:
        LOG.setup("error")
как я понимаю –debug ' это строка которая должна попасть в переменную sys.argv только как она туда попадет не совсем понятно на каком этапе, даелее param это тоже наверное переменая уже в argv и проверятеся в ней наличие –log
, if “=” in param: это вообще не ясно проверяется на наличе = или я чтото не доганяю, и так далее вообще темный лес, ни как не могу понять, помогите разобраться

Офлайн

#2 Апрель 23, 2014 22:47:19

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

проверка при запуске программы python

serrrgggeee
как я понимаю –debug ' это строка которая должна попасть в переменную sys.argv только как она туда попадет не совсем понятно на каком этапе
sys.argv - это список аргументов командной строки
argument vector

если вызываешь
script.py a b c --debug

в sys.argv оказывается
['script.py', 'a', 'b', 'c', '--debug']

serrrgggeee
даелее param это тоже наверное переменая уже в argv
sys.argv - это просто список строк

аналогичный цикл
>>> for p in ['ab', 'bc', 'cd']:
...   print(p)
... 
ab
bc
cd
>>>

serrrgggeee
if “=” in param: это вообще не ясно проверяется на наличе = или я чтото не доганяю
берётся аргумент (строка) и проверяется на наличие –log в начале
если в начале есть –log, то проверяется на наличие = после –log
если после –log есть =, то берётся всё, что идёт после =



Отредактировано py.user.next (Апрель 23, 2014 22:48:58)

Офлайн

#3 Апрель 24, 2014 00:21:44

serrrgggeee
Зарегистрирован: 2014-03-31
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

проверка при запуске программы python

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

python test.py
ясное дело что никаких аргументов нет так каким путем ити аргументы попадут в sys.argv и это значит что проверка не пройдена, и программа не запущена?

Офлайн

#4 Апрель 24, 2014 01:40:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

проверка при запуске программы python

serrrgggeee
ясное дело что никаких аргументов нет так каким путем ити аргументы попадут в sys.argv
в sys.argv окажется
['test.py']

serrrgggeee
спасибо очень разъяснительные ответы, не могли бы что нибудь порекомедавать, что нибудь ближе к практике, учебников много хороших но как правило они все общие понятию дают
я про argv узнал в K&R2 (основная книга по C)

у самого python тоже есть argv
когда вызываешь
python test.py
то python из своего argv (“python”, “test.py”) берёт первый аргумент (“test.py”) и создаёт sys.argv с ним

serrrgggeee
что нибудь ближе к практике
ближе к практике - модуль getopt, он уже всё раскладывает и довольно прост (можно за день его полностью освоить)
а ещё ближе к практике - модуль argparse, там одним днём не обойдёшься, но выучить стоит



Отредактировано py.user.next (Апрель 24, 2014 01:42:33)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version