Отображение результата вызова check_output при вызове CalledProcessError [дубликат]

Да, возможно, но это немного сложно, вы должны:

  • Установите для параметра format значение d (или dd )
  • Установите для параметра maxViewMode значение 0 (minViewMode по умолчанию 0)
  • Скрыть кнопки prev / next month и month name, вы можете сделать это с помощью CSS: представление days datepicker находится внутри таблицы с классом .datepicker-days, а prev и next находятся внутри таблицы .datepicker-days, и они имеют .prev и .next, имя месяца находится в одной таблице и имеет класс .datepicker-switch
  • . Дата datepicker должна показывать правильное количество дней, поэтому вам необходимо динамически обновлять defaultViewDate , когда выбраны год и месяц (см. changeDate событие) Поскольку у сборщика нет метода настройки для defaultViewDate, вы можете destroy , а затем перезапустите его.

Здесь полный рабочий образец:

$(document).ready(function() {
  var dateOpt = {
    format: 'dd',
    maxViewMode: 0
  };
  
  $("#year").datepicker({
    format: "yyyy",
    viewMode: "years",
    minViewMode: "years"
  }).on('changeDate', function(e) {
    var month = $('#month').datepicker('getDate');
    if( !month ){
      month = new Date();
    }
    dateOpt.defaultViewDate = {
      year: e.date.getFullYear(),
      month: month.getMonth(),
      day: 1
    };
    // Reset date datepicker
    $('#date').datepicker('destroy');
    // Re-init with defaultViewDate option
    $('#date').datepicker(dateOpt);
  });

  $("#month").datepicker({
    format: "mm",
    viewMode: "months",
    minViewMode: "months",
    maxViewMode: 0
  }).on('changeDate', function(e) {
    var year = $('#year').datepicker('getDate');
    if( !year ){
      year = new Date();
    }
    dateOpt.defaultViewDate = {
      year: year.getFullYear(),
      month: e.date.getMonth(),
      day: 1
    };
    $('#date').datepicker('destroy');
    $('#date').datepicker(dateOpt);
  });

  $("#date").datepicker(dateOpt)
});
/* Hide prev/next buttons and month name*/
.datepicker-days>table>thead>tr>th.prev,
.datepicker-days>table>thead>tr>th.datepicker-switch,
.datepicker-days>table>thead>tr>th.next {
  display: none;
}

/* Hide days of previous month */
td.old.day{
  visibility: hidden;
}

/* Hide days of next month */
td.new.day{
  display: none;
}







25
задан DanGar 2 May 2014 в 06:14
поделиться

3 ответа

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

Это можно сделать с помощью полей returncode и output.

Например:

import subprocess

try:
   grepOut = subprocess.check_output("grep " + "test" + " tmp", shell=True)                       
except subprocess.CalledProcessError as grepexc:                                                                                                   
    print "error code", grepexc.returncode, grepexc.output
41
ответ дан DanGar 23 August 2018 в 01:09
поделиться
  • 1
    Спасибо, что я хотел. Но теперь мне интересно, есть ли способ получить код возврата без try / except? IE просто получает код возврата check_output, независимо от того, является ли он 0 или 1 или другим, для меня неважно, и мне действительно не нужно сохранять вывод. – Juicy 2 May 2014 в 06:12
  • 2
    Нет проблем. К сожалению, check_output всегда будет вызывать CalledProcessError, если код ошибки не равен нулю. Это означает, что если вы не хотите, чтобы программа внезапно завершалась, вам понадобится предложение try / except. Однако вы можете просто использовать «pass & quot; когда вы попадаете в предложение except, если вам не нужен код ошибки. – DanGar 2 May 2014 в 06:20

есть способ получить код возврата без try / except?

check_output вызывает исключение, если он получает ненулевой статус выхода, поскольку он часто означает, что команда не удалась. grep может возвращать ненулевой статус выхода, даже если нет ошибки - вы могли бы использовать .communicate() в этом случае:

from subprocess import Popen, PIPE

pattern, filename = 'test', 'tmp'
p = Popen(['grep', pattern, filename], stdin=PIPE, stdout=PIPE, stderr=PIPE,
          bufsize=-1)
output, error = p.communicate()
if p.returncode == 0:
   print('%r is found in %s: %r' % (pattern, filename, output))
elif p.returncode == 1:
   print('%r is NOT found in %s: %r' % (pattern, filename, output))
else:
   assert p.returncode > 1
   print('error occurred: %r' % (error,))

Вам не нужно вызывать внешнюю команду для фильтрации линии, вы можете сделать это в чистом Python:

with open('tmp') as file:
    for line in file:
        if 'test' in line:
            print line,

Если вам не нужен вывод; вы можете использовать subprocess.call():

import os
from subprocess import call
try:
    from subprocess import DEVNULL # Python 3
except ImportError: # Python 2
    DEVNULL = open(os.devnull, 'r+b', 0)

returncode = call(['grep', 'test', 'tmp'], 
                  stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL)
25
ответ дан jfs 23 August 2018 в 01:09
поделиться

Python 3.5 ввел метод subprocess.run() . Подпись выглядит так:

subprocess.run(
  args, 
  *, 
  stdin=None, 
  input=None, 
  stdout=None, 
  stderr=None, 
  shell=False, 
  timeout=None, 
  check=False
)

Возвращаемым результатом является subprocess.CompletedProcess . В 3.5 вы можете получить доступ к args, returncode, stdout и stderr из выполненного процесса.

Пример:

>>> result = subprocess.run(['ls', '/tmp'], stdout=subprocess.DEVNULL)
>>> result.returncode
0

>>> result = subprocess.run(['ls', '/nonexistent'], stderr=subprocess.DEVNULL)
>>> result.returncode
2
4
ответ дан mkobit 23 August 2018 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: