Python CLI Menu - PullRequest
       3

Python CLI Menu

1 голос
/ 01 февраля 2012

Я пытаюсь разработать меню, которое будет:

  1. Проверьте, есть ли у / tmp права на запись от пользователя, который запускает скрипт.
  2. Подскажите вопрос: ВСЕ ЛОКАЛЬНЫЕ репозитории находятся в одном месте? например / Главная / джо / HG / (г / п)
    Если ДА, то запросите полные PATH репозитория:

    1. сохранить имена репо (вместе с полным PATH) в списке
    2. скопировать некоторые файлы конфигурации из каталога / tmp / hg-jira-hook-config / во ВСЕ "home / joe / hg //. Hg /"
    3. chmod 755 для всех файлов конфигурации для каждого репо.
  3. Если ответ на вопрос на шаге 2 - «n» или «NO» или «no» то:

    1. запросить отдельные PATH репо
    2. скопировать файлы конфигурации
    3. chmod 755

У меня есть частично рабочий скрипт:

#!/usr/bin/env python
import sys,os
import stat
import tempfile
import shutil

__title_prefix = 'Python %i.%i.%i %s %s' % (sys.version_info[0:4] +
                                           (sys.version_info[4] or "",))

if os.path.exists('/tmp'):
    pass
else:
    print '/tmp does not exist'
    sys.exit()

def isgroupreadable(filepath):
    st = os.stat(filepath)
    return bool(st.st_mode & stat.S_IRGRP)

src = '/tmp/hg-jira-hook-config/' # This directory will be created as a result of apt-get install <package>
                                  # and all config files will be copied 

if isgroupreadable('/tmp'):
    prompt_1 = ("Are ALL your LOCAL repositories in the same location? e.g. /home/joe/hg/<repo>[y/n], Press [q] when done\n")
    answer_1 = raw_input(prompt_1)
    if answer_1 == 'y' or None or 'YES' or 'yes':
        while True:
            answer_2 = raw_input("\n\nEnter the complete PATH of repos.Press [q] when done\n")
    elif answer_1 == 'n' or 'NO' or 'No' or 'no':
        result = raw_input("\n\nEnter the complete PATH of mercurial repositories you want this hook to be applied.Press [q] when done\n")
        print result

else:
    print 'cannot copy, wrong permissions on /tmp'


def main():

    if __name__ == '__main__':
        main()

тестовый прогон:

python preinst 
Are ALL your LOCAL repositories in the same location? e.g. /home/joe/hg/<repo>[y/n], Press [q] when done
y


Enter the complete PATH of repos.Press [q] when done
/home/joe/hg/app1


Enter the complete PATH of repos.Press [q] when done
/home/joe/hg/app2


Enter the complete PATH of repos.Press [q] when done
q


Enter the complete PATH of repos.Press [q] when done

так что вопрос:

Как я могу хранить PATH в LIST (или любой другой структуре данных) и как выйти из этого цикла

1 Ответ

1 голос
/ 02 февраля 2012

Во всех случаях пользователь должен указать хотя бы один путь к программе. Гораздо проще указать этот путь или пути в командной строке (используя, скажем, argparse), чем создать приятный интерактивный интерфейс. Более того, если вы используете парсер аргументов, такой как argparse, ваша программа будет автоматически сценарием. В отличие от интерактивной программы всегда так медленно, как ее пользователь. Поэтому я почти всегда предпочитаю скриптовые программы, а не интерактивные.

Вот как это можно сделать, используя argparse :

import argparse

if __name__ == '__main__':
    parser=argparse.ArgumentParser()
    parser.add_argument('locations', nargs = '+')
    args=parser.parse_args()
    print(args.locations)

Бег

% test.py /path/to/repo
['/path/to/repo']

% test.py /home/joe/hg /home/joe/test
['/home/joe/hg', '/home/joe/test']

argparse также может использоваться в сочетании с интерактивной программой. Например,

import argparse
import shlex
response = raw_input('Enter repo PATHs (e.g. /path/to/repo1 /path/to/repo2)')
parser=argparse.ArgumentParser()
parser.add_argument('locations', nargs = '+')
args=parser.parse_args(shlex.split(response))
print(args.locations)

argparse является частью стандартной библиотеки Python 2.7. Для Python 2.3 или выше вы можете установить argparse .

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