sys.exit(subprocess.call(sys.argv))
时间: 2023-12-27 20:23:19 浏览: 203
根据提供的引用内容,可以得知sys.exit()函数用于退出程序,并返回一个状态码。如果状态码为0,则表示程序正常退出,否则表示程序异常退出。subprocess.call()函数用于执行一个系统命令,并返回状态码。因此,sys.exit(subprocess.call(sys.argv))的作用是执行当前程序的命令行参数,并将返回的状态码作为sys.exit()的参数,从而退出程序。
下面是一个示例代码:
```python
import subprocess
import sys
try:
sys.exit(subprocess.call(sys.argv))
except SystemExit as e:
print("程序已退出,状态码为:", e.code)
finally:
print("程序已结束")
```
在上面的代码中,我们使用try-except-finally语句块来捕获sys.exit()函数抛出的SystemExit异常,并打印程序退出时的状态码。如果程序没有异常退出,则状态码为0。
相关问题
[notice] A new release of pip available: 22.3.1 -> 23.2 [notice] To update, run: c:\Espressif\tools\idf-python\3.11.2\python.exe -m pip install --upgrade pip c:\Espressif\tools\idf-python\3.11.2\python.exe: No module named virtualenv Traceback (most recent call last): File "c:\Espressif\frameworks\esp-idf-v4.4\tools\idf_tools.py", line 1828, in <module> main(sys.argv[1:]) File "c:\Espressif\frameworks\esp-idf-v4.4\tools\idf_tools.py", line 1824, in main action_func(args) File "c:\Espressif\frameworks\esp-idf-v4.4\tools\idf_tools.py", line 1524, in action_install_python_env subprocess.check_call([sys.executable, '-m', 'virtualenv', '--seeder', 'pip', idf_python_env_path], File "subprocess.py", line 413, in check_call subprocess.CalledProcessError: Command '['c:\\Espressif\\tools\\idf-python\\3.11.2\\python.exe', '-m', 'virtualenv', '--seeder', 'pip', 'c:\\Espressif\\python_env\\idf4.4_py3.11_env']' returned non-zero exit status 1. Command failed: "c:\Espressif\tools\idf-python\3.11.2\python.exe" "c:\Espressif\frameworks\esp-idf-v4.4\tools\idf_tools.py" install-python-env WARNING: The script virtualenv.exe is installed in 'C:\Users\Administrator\AppData\Roaming\Python\Python311\Scripts' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. [notice] A new release of pip available: 22.3.1 -> 23.2 [notice] To update, run: c:\Espressif\tools\idf-python\3.11.2\python.exe -m pip install --upgrade pip c:\Espressif\tools\idf-python\3.11.2\python.exe: No module named virtualenv Traceback (most recent call last): File "c:\Espressif\frameworks\esp-idf-v4.4\tools\idf_tools.py", line 1828, in <module> main(sys.argv[1:]) File "c:\Espressif\frameworks\esp-idf-v4.4\tools\idf_tools.py", line 1824, in main action_func(args) File "c:\Espressif\frameworks\esp-idf-v4.4\tools\idf_tools.py", line 1524, in action_install_python_env subprocess.check_call([sys.executable, '-m', 'virtualenv', '--seeder', 'pip', idf_python_env_path], File "subprocess.py", line 413, in check_call subprocess.CalledProcessError: Command '['c:\\Espressif\\tools\\idf-python\\3.11.2\\python.exe', '-m', 'virtualenv', '--seeder', 'pip', 'c:\\Espressif\\python_env\\idf4.4_py3.11_env']' returned non-zero exit status 1.
根据提供的报错信息,看起来是在安装ESP-IDF 4.4时出现了问题。报错信息显示在运行`idf_tools.py`脚本时,执行了一个`subprocess.check_call`命令,但该命令返回了非零的退出状态码。
这个错误通常是由于缺少virtualenv模块导致的。请尝试以下解决方法:
1. 首先,尝试使用以下命令升级pip工具:
```
c:\Espressif\tools\idf-python\3.11.2\python.exe -m pip install --upgrade pip
```
2. 如果升级pip工具成功后,尝试安装virtualenv模块:
```
c:\Espressif\tools\idf-python\3.11.2\python.exe -m pip install virtualenv
```
3. 如果安装virtualenv模块成功后,再次尝试安装ESP-IDF 4.4:
```
c:\Espressif\frameworks\esp-idf-v4.4\tools\idf_tools.py install-python-env
```
这些步骤应该能够解决virtualenv模块缺失的问题。如果问题仍然存在,请提供更多的报错信息,以便我更好地帮助您解决问题。
转python写法:#!/bin/sh time_stamp=`date +%s` function CheckStop() { if [ $? -ne 0 ]; then echo "execute fail, error on line_no:"$1" exit!!!" exit fi } function GenEcdsaKey() { ec_param_file_path="/tmp/ec_param.pem."$time_stamp openssl ecparam -out $ec_param_file_path -name prime256v1 -genkey CheckStop $LINENO openssl genpkey -paramfile $ec_param_file_path -out $1 CheckStop $LINENO openssl pkey -in $1 -inform PEM -out $2 -outform PEM -pubout CheckStop $LINENO rm $ec_param_file_path echo "gen_ecdsa_key succ prikey_path:"$1" pubkey_path:"$2 } function GenEcdsaSign() { ec_sign_info_file="/tmp/ec_sign_info_file."$time_stamp ec_sign_info_sha256="/tmp/ec_sign_info_sha256."$time_stamp ec_binary_sign_file="/tmp/ec_binary_sign_file."$time_stamp echo -n "$1"_"$2" > $ec_sign_info_file openssl dgst -sha256 -binary -out $ec_sign_info_sha256 $ec_sign_info_file CheckStop $LINENO openssl pkeyutl -sign -in $ec_sign_info_sha256 -out $ec_binary_sign_file -inkey $3 -keyform PEM CheckStop $LINENO openssl base64 -e -in $ec_binary_sign_file -out $4 CheckStop $LINENO rm $ec_sign_info_file $ec_sign_info_sha256 $ec_binary_sign_file echo "gen_ecdsa_sign succ sign_file_path:"$4 } function VerifyEcdsaSign() { ec_sign_info_file="/tmp/ec_sign_info_file."$time_stamp ec_sign_info_sha256="/tmp/ec_sign_info_sha256."$time_stamp ec_binary_sign_file="/tmp/ec_binary_sign_file."$time_stamp echo -n "$1"_"$2" > $ec_sign_info_file openssl dgst -sha256 -binary -out $ec_sign_info_sha256 $ec_sign_info_file CheckStop $LINENO openssl base64 -d -in $4 -out $ec_binary_sign_file CheckStop $LINENO openssl pkeyutl -verify -in $ec_sign_info_sha256 -sigfile $ec_binary_sign_file -pubin -inkey $3 -keyform PEM rm $ec_sign_info_file $ec_sign_info_sha256 $ec_binary_sign_file } function Usage() { echo "Usage:" echo "mmiot_ecdsa_sign.sh gen_ecdsa_key <private_key_file_path> <public_key_file_path>" echo "mmiot_ecdsa_sign.sh gen_ecdsa_sign <product_id> <sn> <private_
以下是转换后的 Python 代码:
```python
#!/usr/bin/env python
import os
import subprocess
import base64
time_stamp = str(int(time.time()))
def check_stop(line_no, ret):
if ret != 0:
print("execute fail, error on line_no: ", line_no, " exit!!!")
exit()
def gen_ecdsa_key(private_key_file_path, public_key_file_path):
ec_param_file_path = "/tmp/ec_param.pem." + time_stamp
ret = subprocess.call(["openssl", "ecparam", "-out", ec_param_file_path, "-name", "prime256v1", "-genkey"])
check_stop(sys._getframe().f_lineno, ret)
ret = subprocess.call(["openssl", "genpkey", "-paramfile", ec_param_file_path, "-out", private_key_file_path])
check_stop(sys._getframe().f_lineno, ret)
ret = subprocess.call(["openssl", "pkey", "-in", private_key_file_path, "-inform", "PEM", "-out", public_key_file_path, "-outform", "PEM", "-pubout"])
check_stop(sys._getframe().f_lineno, ret)
os.remove(ec_param_file_path)
print("gen_ecdsa_key succ prikey_path:", private_key_file_path, " pubkey_path:", public_key_file_path)
def gen_ecdsa_sign(product_id, sn, private_key_file_path, sign_file_path):
ec_sign_info_file = "/tmp/ec_sign_info_file." + time_stamp
ec_sign_info_sha256 = "/tmp/ec_sign_info_sha256." + time_stamp
ec_binary_sign_file = "/tmp/ec_binary_sign_file." + time_stamp
with open(ec_sign_info_file, 'w') as f:
f.write(product_id + "_" + sn)
ret = subprocess.call(["openssl", "dgst", "-sha256", "-binary", "-out", ec_sign_info_sha256, ec_sign_info_file])
check_stop(sys._getframe().f_lineno, ret)
ret = subprocess.call(["openssl", "pkeyutl", "-sign", "-in", ec_sign_info_sha256, "-out", ec_binary_sign_file, "-inkey", private_key_file_path, "-keyform", "PEM"])
check_stop(sys._getframe().f_lineno, ret)
with open(ec_binary_sign_file, 'rb') as f:
sign_binary = f.read()
sign_base64 = base64.b64encode(sign_binary).decode()
with open(sign_file_path, 'w') as f:
f.write(sign_base64)
os.remove(ec_sign_info_file)
os.remove(ec_sign_info_sha256)
os.remove(ec_binary_sign_file)
print("gen_ecdsa_sign succ sign_file_path:", sign_file_path)
def verify_ecdsa_sign(product_id, sn, public_key_file_path, sign_file_path):
ec_sign_info_file = "/tmp/ec_sign_info_file." + time_stamp
ec_sign_info_sha256 = "/tmp/ec_sign_info_sha256." + time_stamp
ec_binary_sign_file = "/tmp/ec_binary_sign_file." + time_stamp
with open(ec_sign_info_file, 'w') as f:
f.write(product_id + "_" + sn)
ret = subprocess.call(["openssl", "dgst", "-sha256", "-binary", "-out", ec_sign_info_sha256, ec_sign_info_file])
check_stop(sys._getframe().f_lineno, ret)
with open(sign_file_path, 'r') as f:
sign_base64 = f.read()
sign_binary = base64.b64decode(sign_base64)
with open(ec_binary_sign_file, 'wb') as f:
f.write(sign_binary)
ret = subprocess.call(["openssl", "pkeyutl", "-verify", "-in", ec_sign_info_sha256, "-sigfile", ec_binary_sign_file, "-pubin", "-inkey", public_key_file_path, "-keyform", "PEM"])
os.remove(ec_sign_info_file)
os.remove(ec_sign_info_sha256)
os.remove(ec_binary_sign_file)
print("verify_ecdsa_sign result:", "succ" if ret == 0 else "fail")
if len(sys.argv) < 2:
print("Usage:")
print("python mmiot_ecdsa_sign.py gen_ecdsa_key <private_key_file_path> <public_key_file_path>")
print("python mmiot_ecdsa_sign.py gen_ecdsa_sign <product_id> <sn> <private_key_file_path> <sign_file_path>")
print("python mmiot_ecdsa_sign.py verify_ecdsa_sign <product_id> <sn> <public_key_file_path> <sign_file_path>")
exit()
if sys.argv[1] == "gen_ecdsa_key":
gen_ecdsa_key(sys.argv[2], sys.argv[3])
elif sys.argv[1] == "gen_ecdsa_sign":
gen_ecdsa_sign(sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5])
elif sys.argv[1] == "verify_ecdsa_sign":
verify_ecdsa_sign(sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5])
else:
print("Usage:")
print("python mmiot_ecdsa_sign.py gen_ecdsa_key <private_key_file_path> <public_key_file_path>")
print("python mmiot_ecdsa_sign.py gen_ecdsa_sign <product_id> <sn> <private_key_file_path> <sign_file_path>")
print("python mmiot_ecdsa_sign.py verify_ecdsa_sign <product_id> <sn> <public_key_file_path> <sign_file_path>")
```
阅读全文