Python ошибка повышение NotImplementedError при попытке вызвать команду оболочки async - PullRequest
3 голосов
/ 27 февраля 2020

Я новичок с Python программированием. Я хочу вызвать несколько команд оболочки параллельно и получить их результат, накопленный в одном массиве, как метод javascript promise.all().
У меня есть следующий код в Python

import asyncio
import os


commands = [
    'netstat -n | findstr 55601',
    'dir | findstr portMonitoring.py',
    'ssh 10.6.100.192 netstat'
]

async def job(cmd):
    # await asyncio.sleep(1)
    # return "HEE"
    # return os.popen(cmd).read()
    process = await asyncio.create_subprocess_exec(
        cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
    )

    return await process.communicate()



async def main():
    jobs = [job(cmd) for cmd in commands]
    done, pending = await asyncio.wait(jobs, return_when=asyncio.FIRST_COMPLETED)
    folders = []
    [folders.append(d.result()) for d in done]
    print("RESULT:", folders)

asyncio.run(main())

Я получаю следующую ошибку и не могу найти решение, пожалуйста, помогите Спасибо.

Traceback (most recent call last):
  File "test.py", line 16, in job
    cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
  File "C:\DEV\Python3.7.4\lib\asyncio\subprocess.py", line 217, in create_subprocess_exec
    stderr=stderr, **kwds)
  File "C:\DEV\Python3.7.4\lib\asyncio\base_events.py", line 1529, in subprocess_exec
    bufsize, **kwargs)
  File "C:\DEV\Python3.7.4\lib\asyncio\base_events.py", line 458, in _make_subprocess_transport
    raise NotImplementedError
NotImplementedError

Ответы [ 2 ]

1 голос
/ 03 марта 2020

https://github.com/python/cpython/blob/master/Lib/asyncio/base_events.py#L493

Это запланированная функция, но она еще не реализована. Это будет работать в будущем, но текущие версии не поддерживают его.

Я просмотрел другие ветки и ни одна из них не реализована. Модуль подпроцесса (https://docs.python.org/3/library/subprocess.html) широко известен, и поддержка asyncio для него еще не закончена. Конечные точки были определены, но на данный момент они непригодны для использования.

0 голосов
/ 07 марта 2020

Объясняется в документах:

Python 3,7

https://docs.python.org/3.7/library/asyncio-platforms.html#asyncio - windows -подпроцесс

SelectorEventL oop на Windows не поддерживает подпроцессы. В Windows вместо этого следует использовать ProactorEventL oop:

import asyncio

asyncio.set_event_loop_policy(
    asyncio.WindowsProactorEventLoopPolicy())

asyncio.run(your_code())

Python 3.8

Событие по умолчанию l oop для Windows теперь ProactorEventL oop.

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