Как проверить, установлен ли модуль или нет, используя подпроцесс в оболочке? - PullRequest
1 голос
/ 14 июля 2020

Я хочу запустить подпроцесс, чтобы проверить, установлен ли python-docx аналогично this , где строки

verify_installation = subprocess.run(["pdftotext -v"], shell=True)
        if verify_installation.returncode == 127:

проверяют, установлен ли pdftotext или нет, и если он не установлен (returncode ==127), тогда возникает исключение.

Я хочу иметь аналогичную реализацию, чтобы проверить, установлен ли python-docx, однако во время отладки в Colab, даже после установки python-docx, возвращается тот же код возврата.

Какова интерпретация (returncode ==127) и как вызвать исключение, только если библиотека не установлена.

И что именно делает subprocess.run(["pdftotext -v"], shell=True) достичь.

Ответы [ 2 ]

0 голосов
/ 15 июля 2020

Я нашел решение, оно не использует подпроцесс, как я уже упоминал, но я включаю ответ, чтобы убедиться, что кто-то, кто сталкивается с подобной проблемой «Проверить, установлен ли модуль, и если не поймать ошибку» может попробуйте.

try:
    import docx
except ImportError as e:
    raise Exception( 
        #do something
    )

В случае, если импорт модуля создает проблемы, я все еще ищу решение, которое запускает подпроцессы оболочки без необходимости импорта модуля.

0 голосов
/ 14 июля 2020

Я могу порекомендовать другой подход для этого, передать PIPE s в stderr и stdout для порожденного процесса и проверить эти каналы после возврата дочернего процесса.

import subprocess
outs=None
errs=None

try:
    proc=subprocess.Popen(["pdftotext -v"], shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    outs, errs = proc.communicate(timeout=15)  #timing out the execution, just if you want, you dont have to!
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

#parse the stderr and stdoutput of proc:
f_check_if_has_errors(errs, outs)

Также рассмотрите возможность использования / look subprocess.check_call метод ниже:

try:
  proc = subprocess.check_call(["pdftotext -v"], shell=True)
  proc.communicate()
except subprocess.CalledProcessError:
  # There was an error - command exited with non-zero code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...