调用导入的hx711py示例文件中cleanAndExit函数无法停止程序求助
核心问题原因
- 第一:Python导入模块时会自动执行模块内所有顶层代码(也就是没有封装在函数、类中的代码)。你提供的
example.py中包含无限循环的while True顶层代码,当你执行import example时,程序会直接卡在这个无限循环中持续输出重量数据,根本不会执行你新文件中后续的for循环和cleanAndExit()调用,所以你会觉得函数调用没生效。 - 第二:你新写的测试文件存在语法错误,已经通过
from time import sleep导入了休眠函数,直接调用sleep(5)即可,sleep.time(5)是错误写法,不过当前场景下你还没触发这个错误就已经被example.py的死循环卡住了。
解决步骤
1. 修改example.py,封装顶层执行逻辑
在example.py中,把除了导入语句、变量定义、函数定义之外的所有执行代码,都放到if __name__ == "__main__":判断下,这个判断的作用是:只有直接运行example.py文件时才会执行包裹的代码,被其他文件导入时不会执行。
修改后的example.py代码如下:
#! /usr/bin/python2 import time import sys EMULATE_HX711=False if not EMULATE_HX711: import RPi.GPIO as GPIO from hx711 import HX711 else: from emulated_hx711 import HX711 def cleanAndExit(): print("Cleaning...") if not EMULATE_HX711: GPIO.cleanup() print("Bye!") sys.exit() # 以下是原来的顶层执行代码,全部放到main判断下 if __name__ == "__main__": hx = HX711(5, 6) hx.set_reading_format("MSB", "MSB") #---Actual Calibrated Weight and display value---# #referenceUnit = display value/actual weight -> Temporarily =1 until first calibration with load cells referenceUnit = 1 hx.set_reference_unit(referenceUnit) hx.reset() hx.tare() print("Tare done! Add weight now...") while True: try: val = hx.get_weight(5) print(val) # 双通道读取的示例代码保留即可 #val_A = hx.get_weight_A(5) #val_B = hx.get_weight_B(5) #print "A: %s B: %s" % ( val_A, val_B ) hx.power_down() hx.power_up() time.sleep(0.1) except (KeyboardInterrupt, SystemExit): cleanAndExit()
2. 修改你的测试文件代码
修正语法错误,调整后的代码如下:
import time from time import sleep import example from example import cleanAndExit for i in range(5): sleep(5) cleanAndExit()
验证效果
修改完成后运行你的测试文件,导入example时不会再触发无限循环,程序会依次执行5次休眠,之后调用cleanAndExit()打印退出提示、清理GPIO资源后正常终止程序。
内容的提问来源于stack exchange,提问作者mhenrytran
相关产品推荐
相关产品推荐

