AutoFramework/Base/Class/Command.py

60 lines
1.9 KiB
Python

import sys
import chardet
import subprocess
def shell(cmd='', stdout=None, stderr=None, timeout=None):
match stdout:
case 'NULL' | 'Null' | 'null':
stdoutCh = subprocess.DEVNULL
case None:
stdoutCh = subprocess.PIPE
case _:
stdoutCh = stdout
match stderr:
case 'NULL' | 'Null' | 'null':
stderrCh = subprocess.DEVNULL
case None:
stderrCh = subprocess.PIPE
case _:
stderrCh = stderr
try:
result = subprocess.run(cmd, shell=True, stdout=stdoutCh, stderr=stderrCh, timeout=timeout)
stdoutContent = ''
stderrContent = ''
if result.stdout:
stdoutContent = result.stdout.decode(chardet.detect(result.stdout)["encoding"] or 'UTF-8')
if result.stderr:
stderrContent = result.stderr.decode(chardet.detect(result.stderr)["encoding"] or 'UTF-8')
return {
"code": result.returncode, "stdout": stdoutContent, "stderr": stderrContent
}
except subprocess.TimeoutExpired:
return {
"code": 1,
"stdout": '',
"stderr": 'Execution timeout.'
}
if __name__ == '__main__':
# # Example. Normal.
# print(shell('ping www.taobao.com'))
# # Example. No STDOUT.
# print(shell('ping www.taobao.com', stdout='NULL'))
# # Example. No STDERR.
# print(shell('ping www.taobao.com', stderr='NULL'))
# # Example. No STDOUT and STDERR.
# print(shell('ping www.taobao.com', stdout='NULL', stderr='NULL'))
# # Example. With Timeout.
# print(shell('ping www.taobao.com', timeout=3))
# # Example. With Timeout Not.
# print(shell('ping www.taobao.com', timeout=8))
# # Example. Curl.
# print(shell('curl "https://www.baidu.com/"'))
# # Example. Unknown Command.
# print(shell('busybox ls'))
import sys
shell(cmd='ping 119.29.29.29', stdout=sys.stdout)