python-run-cmd

Run a command within python


License
MIT
Install
pip install python-run-cmd==0.1.1

Documentation

run-cmd

pytestpythonCode style: blackLicense: MITPyPI version

Run a command within python

Install it

pip install python-run-cmd
# pip install git+https://github.com/ffreemt/run-cmd
# poetry add git+https://github.com/ffreemt/run-cmd
# git clone https://github.com/ffreemt/run-cmd && cd run-cmd

Use it

run_cmd

from python_run_cmd import run_cmd

ret = run_cmd("ls -l")
if ret.returncode:
  print("Failed")
else:
  print("OK")

An exception will be raised when errors occur. This may come handy sometimes.

from python_run_cmd import run_cmd

try:
  ret = run_cmd("lsss -l")
except Exception as exc:
  print(exc)
# 'lsss' is not recognized as an internal
# or external command, operable program or batch file.

Set raise_stderr=False to ignore errors

from python_run_cmd import run_cmd

ret = run_cmd("lsss -l", raise_stderr=False)
if ret.returncode:
  print("Failed")
else:
  print("OK")

run_cmd_async

Simultaneously run several commands:

import asyncio
import webbrowser
from python_run_cmd import run_cmd_async

async def browse_8000():
    webbrowser.open("http://127.0.0.1:8000")

async def main():
  return await asyncio.gather(
    run_cmd_async("ping www.baidu.com"),
    browse_8000(),
    run_cmd_async("python -m http.server"),
  )

asyncio.run(main())

For Python up to 3.10, it can be simplified (it won't work with Python 3.11):

import asyncio
import webbrowser
from python_run_cmd import run_cmd_async

async def browse_8000():
    webbrowser.open("http://127.0.0.1:8000")

asyncio.run(
  asyncio.wait(
    [
    run_cmd_async("ping www.baidu.com"),
    browse_8000(),
    run_cmd_async("python -m http.server"),
    ]
  )
)

Note there is no auxiliary async main function.

run_cmd_stream

Some commands take a long time to complete. If we want to see live stream output (one line at a time), run_cmd_stream can be used.

from python_run_cmd import run_cmd_stream

run_cmd_stream("ping -n 100 baidu.com")

We won't have to wait until all 100 pings to complete to see the output.