subprocess.CalledProcessError: ... вернул ненулевой статус выхода 255 - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь запустить чужой код, который, как мне кажется, никогда не запускался на Windows, и я не могу пройти мимо 'git log | head -n 1 | awk '{print $2}'' returned non-zero exit status 255:

Logging to ./logs/log_j0_t0.txt
Traceback (most recent call last):
  File "C:\Users\mcram\Documents\Github\low-memory-fnn-training\napoleon\utils\log_utils.py", line 55, in log_git_commit_info
    stderr=subprocess.PIPE)
  File "C:\Users\mcram\Anaconda3\envs\pytorch\lib\subprocess.py", line 512, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command 'git log | head -n 1 | awk '{print $2}'' returned non-zero exit status 255.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 86, in <module>
    main()
  File "main.py", line 23, in main
    init_log(args)
  File "C:\Users\mcram\Documents\Github\low-memory-fnn-training\napoleon\utils\log_utils.py", line 36, in init_log
    log_git_commit_info()
  File "C:\Users\mcram\Documents\Github\low-memory-fnn-training\napoleon\utils\log_utils.py", line 62, in log_git_commit_info
    returncode, err_type=subprocess.CalledProcessError, cmd=cmd)
  File "C:\Users\mcram\Documents\Github\low-memory-fnn-training\napoleon\utils\log_utils.py", line 109, in log_error
    raise err_type(msg, **kwargs)
subprocess.CalledProcessError: Command 'git log | head -n 1 | awk '{print $2}'' returned non-zero exit status 255.

Я бегу Windows 10 и git version 2.14.2.windows.1 установлены. Ниже приведена соответствующая функция от log_utils.py. Строка 55: stderr=subprocess.PIPE).

def log_git_commit_info():
    get_commit_hash = "git log | head -n 1 | awk '{print $2}'"
    check_unstaged = 'git diff --exit-code'
    check_staged = 'git diff --cached --exit-code'
    status = 'git status'
    cmds = [get_commit_hash, check_unstaged, check_staged, status]
    do_checks = [True, False, False, True]
    saved_infos = []
    for cmd, do_check in zip(cmds, do_checks):
        try:
            process_result = subprocess.run(
                cmd,
                shell=True,
                check=do_check,
                universal_newlines=True,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE)
            saved_infos.append((process_result.returncode,
                                process_result.stdout.strip()))
        except subprocess.CalledProcessError as e:
            err_msg = str(e)
            returncode = int(err_msg.split()[-1][:-1])
            log_error(
                returncode, err_type=subprocess.CalledProcessError, cmd=cmd)
    commit_hash = saved_infos[0][1]
    log_info('Current commit: ' + commit_hash)
    if saved_infos[1][0] or saved_infos[2][0]:
        log_warn('Uncommitted changes present!')
        log_warn("Output of 'git status':\n" + saved_infos[3][1])
        log_info("Output of 'git diff HEAD':")
        diff_output = subprocess.run(
            'git diff HEAD',
            shell=True,
            check=do_check,
            universal_newlines=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE)
        log_info(diff_output.stdout)

Единственное, что я могу предположить, это то, что git log | head -n 1 | awk '{print $2}' вызывает ошибку, в частности, ошибку 255. Я искал повсюду объяснения кодов ошибок, но пока не нашел ничего, что кажется странным. Разве документы не должны объяснять коды ошибок?

В любом случае, я попытался просто запустить эту команду из командной строки, и я получил это:

(pytorch) C:\Users\mcram\Documents\Github\low-memory-fnn-training\apps\cifar10>git log | head -n 1 | awk '{print $2}'
'head' is not recognized as an internal or external command,
operable program or batch file.

Может ли тот факт, что 'head' is not recognized as an internal or external command будет ошибка 255? Мне интересно, если это только потому, что я бегу из командной строки. От https://github.com/sr320/LabDocs/issues/664#issuecomment -318851496 Мне также интересно, если проблема в том, что Git Bash нет в моем PATH. Открытие Git Bash и запуск cat ~/.bash_profile, однако, дает мне cat: /c/Users/mcram/.bash_profile: No such file or directory. Я, однако, получаю это, которое, кажется, не включает путь к Анаконде:

$ echo $PATH
/c/Users/mcram/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/bin:/mingw64/bin:/usr/bin:/c/Users/mcram/bin:/c
/ProgramData/DockerDesktop/version-bin:/c/Program Files/Docker/Docker/Resources/bin:/c/Program 
Files/NVIDIA GPU Computing Toolkit/CUDA/v10.1/bin:/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA
/v10.1/libnvvp:/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v8.0/bin:/c/Program Files/NVIDIA GPU 
Computing Toolkit/CUDA/v8.0/libnvvp:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows
/System32/WindowsPowerShell/v1.0:/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/c/Program 
Files/PuTTY:/cmd:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/WINDOWS/System32
/WindowsPowerShell/v1.0:/c/WINDOWS/System32/OpenSSH:/c/Program Files/NVIDIA Corporation/Nsight Compute 
2019.3.0:/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/DAL:/c/Program Files/Intel
/Intel(R) Management Engine Components/DAL:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:
/c/WINDOWS/System32/WindowsPowerShell/v1.0:/c/WINDOWS/System32/OpenSSH:/c/Users/mcram/AppData/Local
/Microsoft/WindowsApps:/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v8.0/extras/CUPTI/libx64:
/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v8.0/lib/x64:/c/Users/mcram/AppData/Local
/GitHubDesktop/bin:/c/Users/mcram/AppData/Local/Microsoft/WindowsApps:/usr/bin/vendor_perl:/usr/bin
/core_perl

Если я не могу найти .bash_profile, я не знаю, как обновить PATH, и даже если бы мне удалось его найти, я бы не знал, что туда вставить, поскольку я не запускаю скрипт в Jupyter, а скорее в командной строке Python. У меня закончились идеи, и я мог бы помочь. Спасибо.

1 Ответ

1 голос
/ 23 февраля 2020

Документация Python гласит следующее:

Вкл. Windows с shell = True, переменная среды COMSPE C определяет оболочку по умолчанию.

Это означает, что вы, вероятно, пытаетесь вызвать cmd вместо sh или bash. Здесь лучше всего избегать shell=True и вместо этого устанавливать для переменной cmd что-то вроде следующего:

cmd = ["sh", "-c", cmd]

Обратите внимание, что на Linux мы обычно пишем /bin/sh, не sh, но поскольку вы используете Windows, это не сработает. Это решение также будет переносимо на Linux и большинство других Unix систем, в случае, если это имеет значение для вас.

Как только вы используете sh (я полагаю, с Git для Windows ), он должен иметь ПУТЬ, установленную соответствующим образом для всех других команд Unix.

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