初始化数组时出现分段错误

2024-10-02 08:27:48 发布

您现在位置:Python中文网/ 问答频道 /正文

初始化数组时出现分段错误。你知道吗

当读到RFID标签时,我有一个回调函数

IDS = []
def readTag(e):
    epc = str(e.epc, 'utf-8')
    if not epc in IDS:
        now = datetime.datetime.now().strftime('%m/%d/%Y %H:%M:%S')
        IDS.append([epc, now, "name.instrument"])

一个调用它的主函数

def main():
    for x in vals:
        IDS.append([vals[0], vals[1], vals[2]])
    for x in IDS:
        print(x[0])
    r = mercury.Reader("tmr:///dev/ttyUSB0", baudrate=9600)
    r.set_region("NA")

    r.start_reading(readTag, on_time=1500)
    input("press any key to stop reading: ")
    r.stop_reading()

由于行IDS.append([epc, now, "name.instrument"])而发生错误。我知道,因为当我用一个print调用代替它时,程序就可以正常运行了。我尝试过对数组对象(整数)使用不同的类型,在append函数外创建一个相同对象的数组,等等。出于某种原因,仅仅在“readTag”函数内创建一个数组会导致像row = [1,2,3]这样的分段错误

有人知道是什么原因导致了这个错误,我可以如何修复它吗?更具体地说,readTag函数在前两次(只有两次)调用中可以正常工作,但随后它崩溃了,具有start_reading()函数的Reader对象来自mercury api


Tags: 对象函数inidsdatetimedef错误数组
2条回答

为了扩展Michael的回答,这似乎是范围界定和您使用的API的问题。一般来说,纯Python不会出错。或者至少,它不应该出现seg错误,除非解释器中有bug,或者您正在使用的扩展。这并不是说纯Python不会崩溃,只是一个真正的seg错误表明这个问题可能是代码之外的混乱导致的。你知道吗

我假设你用的是this Python API。你知道吗

在这种情况下自述文件.md提到您使用的Reader.start_reader()方法是“异步的”。这意味着它调用一个新的线程或进程并立即返回,然后每次扫描某个内容时,后台线程继续调用回调。你知道吗

我对CPython的本质知之甚少,无法确切地说明发生了什么,但是您已经将IDS = []声明为一个全局变量,而且似乎后台线程正在使用与主程序不同的上下文运行回调。因此,当它试图访问IDS时,它正在读取它不拥有的内存,因此出现seg错误。你知道吗

由于回调的限制性和明显的缓冲区不足,这可能是开发人员的疏忽。如果您真的需要异步读取,那么值得向他们发送问题报告。你知道吗

否则,考虑到您只是在等待输入,您可能不需要异步读取,您可以在自己的忙循环中使用synchronousReader.read()方法,而不是像这样:

try:
    while True:
        readTags(r.read(timeout=10))
except KeyboardInterrupt: ## break loop on SIGINT (Ctrl-C)
    pass

请注意,r.read()返回一个标记列表,而不仅仅是一个标记列表,因此您需要稍微修改回调,如果您编写的不仅仅是一个快速脚本,那么您可能希望使用线程来正确中断循环,因为SIGINT非常有黑客性。你知道吗

对我来说,这看起来像是一个范围问题;mercury库没有访问列表内存地址的权限,因此当它调用回调函数readTag(e)时,会发生segfault。我不认为你想要的行为得到了那个库的支持

相关问题 更多 >

    热门问题