Czy to błąd subprocess czy ja robię coś źle?

0

działa
s_wyn=subprocess.check_output('dnf list ', shell=True)
wywala błąd: Command 'dnf check-update' returned non-zero exit status 100
s_wyn=subprocess.check_output('dnf check-update ', shell=True)

Python 3.7.3

Myślę, że to błąd modułu subprocess

cały błąd:
File "/usr/lib64/python3.7/subprocess.py", line 395, in check_output
**kwargs).stdout
File "/usr/lib64/python3.7/subprocess.py", line 487, in run
output=stdout, stderr=stderr)
wg: pip list --outdated
mam aktualne
Czy może to ktoś sprawdzić u siebie?

Aaa czy używać subprocess.check_output() czy os.sytem()

Dziwi mnie forma odpowiedzi dnf check-update w terminalu:
jest dwulinijkowa z aktualnym i nowym pakietem, ale jak przekażemy do less to robią się tylko nowe.
Może to to? Dodatkowo śledziłem wątek na bugzilli o dnf z błędem który mi przeszkadzał. Oczywiście trzeba było zaktualizować pakiet dnf i to co było źle to działa. Ale w tym zaktualizowanym znalazłem podobny błąd w innej części.
Używam Fedory 30 i tam:
dnf repolist all
jest ok, ale już przekierowanie do less
daje bałagan. Czyli potoki odpadają. I to poprawiono przy normalnym dnf list bo też był bałagan. dnf repolist all zostało niepoprawione.
Bugzilla 584525

0

Nie less tylko przekierowanie do less. Potoki odpadają.

0

szkoda że nie widać na obrazku jaka komenda jest wywoływana, ale mniejsza z tym. Być może w w grę wchodzą jakieś kody sterujące np. ANSI dla kolorów. Poza tym jeżeli wynik less jest nimi zabałaganiony to zwykle pomaga less -R, ale chyba z tym nie ma tu problemu.

Programy które ślą do stdout potrafią sprawdzić czy tam jest terminal czy pipe. Może dnf bada to oraz uzyskuje maksymalną liczbę kolumn terminala podłączonego do stdout i wtedy skraca zbyt długie linie. Wydaje mi się, że argument shell=True może mieć na to wpływ, który tak na marginesie z tego co pamiętam jest podatny na shell injection.

0

Ale czego ty się spodziewasz skoro less jest interaktywną komendą? o_O

0

Jaka komenda jest wywoływana podałem w pierwszym poście. Tam nawet jest bug dnf-a z bugzilli, ale tyczy sie parametru list, a nie został poprawiony repolist all. Ja proszę jedynie o weryfikację subprocess.check_output('dnf check-update'.....

0

Co do tych pomysłów, to są nieco nieeleganckie. Listowanie wszystkiego robi się tak:

from dnf.cli import dnf
base = dnf.Base()
base.read_all_repos()
base.fill_sack()
q = base.sack.query()
for package in q.available():
    print(package)

Warto generalnie wiedzieć, że dnf jest napisany w Pythonie.

Edit: upgrades analogicznie, robisz to co powyżej, a potem

print(list(q.upgrades().available()))
0
Radosław Głębicki napisał(a):

Jaka komenda jest wywoływana podałem w pierwszym poście. Tam nawet jest bug dnf-a z bugzilli, ale tyczy sie parametru list, a nie został poprawiony repolist all. Ja proszę jedynie o weryfikację subprocess.check_output('dnf check-update'.....

Oto moja weryfikacja, poniższy skrypt nie wywalił żadnego błędu:

#!/usr/bin/env python3
import subprocess
s_wyn=subprocess.check_output('dnf check-update', shell=True)
print(s_wyn.decode('utf-8'))

Edit: taki jeszcze mały research:
$ dnf repolist all - sprawdza liczbę kolumn terminala (tput cols) i dopasowuje szerokość kolumn
$ dnf repolist all | less - zakłada szerokość 80 kolumn, więc jak teminal ma mniej to wynik less się rozjedzie

0

to na końcu wiem dlatego nie da się w pipe posłać bo się rozwala. to samo było przy list ale poprawili. Jeśli chodzi o subprocess to nie ma róznicy. dalej to samo. ja jedynie używam .decode('utf-8") za subprocess, ale bez różnicy. Jaką wersję pythona? Zakładam ze dnf w linuksie testowałeś jaka dystrybucja?

wersja pythona 3.7.7

instalowałem VMke pierwszą z brzegu vagrant init generic/fedora30 więc to chyba fedora30. Sprawdziłem tak na szybko grep 80 **/* w katalogu /usr/lib/python3.7/site-packages/dnf i jeden z wyników cli/term.py ma takie coś w sobie:

def _term_width(fd=1):
    """ Compute terminal width falling to default 80 in case of trouble"""
    tw = _real_term_width(fd=1)
    if not tw:
        return 80
    elif tw < 20:
        return 20
    else:
        return tw

czyli jeżeli stdout nie jest terminalem a pipe-em to liczba kolumn będzie równa 80 co oczywiście sprawia, że less ma poobcinane wiersze. Więc przydała by się opcja dla dnf, żeby automatycznie dopasowywał sobie liczbę kolumn do najdłuższej komórki, albo może jakieś zawijanie wierszy? Najlepiej by było zwracać np. -1 i tam gdzie jest to wykorzystywane obliczyć na bieżąco na podstawie aktualnych danych.

Tak na szybko to można w linii 3 fd=1 zamienić na fd=0 czyli stdin. Nie sądzę aby ta komenda przyjmowała cokolwiek ze standardowego wejścia, albo było kolejnym elementem w potoku ... | dnf ... | ..., więc można by założyć że będzie zawsze terminalem. Sprawdziłem i less już nie ma poobcinanych wierszy, ale nie nazwałbym tego poprawnym rozwiązaniem. Trzeba by dalej pogrzebać w kodzie i wymyślić coś sprytniejszego.

1

Ale to nawet nie jest kwestia lessa, i to nawet nie jest kwestia subprocess, u mnie na Fedorze 31 (normalnie używanej, nie na vagrancie), mam podobnie, jak w terminalu uruchomię check-update, kod wyjścia to 100.

Nie jest to bug, jak spojrzysz w manual, to zobaczysz taką sekcję:

   Check-Update Command
       dnf [options] check-update [--changelogs] [<package-file-spec>...]
          Non-interactively checks if updates of the specified packages are available. If no  <package-file-spec>
          is  given,  checks  whether any updates at all are available for your system. DNF exit code will be 100
          when there are updates available and a list of the updates will be printed, 0 if not and 1 if an  error
          occurs.  If  --changelogs  option is specified, also changelog delta of packages about to be updated is
          printed.
0
Signature: subprocess.check_output(*popenargs, timeout=None, **kwargs)
Docstring:
Run command with arguments and return its output.

If the exit code was non-zero it raises a CalledProcessError.  The
CalledProcessError object will have the return code in the returncode
attribute and output in the output attribute.

Zgodnie z dokumentacją, dostajesz wyjątek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0