python中导入包时会出现的一个问题
我在尝试使用python的多进程模块编程的时候,发现在导入Queue这个包的时候始终报错
情况是这样的:
文件夹结构如下:
multi
queue.py
queue.py的内容为:
from multiprocessing import Process
from multiprocessing import Queue
#from queue import Queue
import os,time,random
#写数据进程的代码
def proc_write(q,urls):
print('Process(%s) is writing...' % os.getpid())
for url in urls:
q.put(url)
print('Put %s to queue...' % url)
time.sleep(random.random())
#读数据进程执行的代码
def proc_read(q):
print('Process(%s) is reading...' % os.getpid())
while True:
url=q.get(True)
print('Get %s from queue.' % url)
if __name__=='__main__':
#父进程创建Queue,并传递给每个子进程
q=Queue()
proc_writer1=Process(target=proc_write,args=(q,['url_1','url_2','url_3']))
proc_writer2=Process(target=proc_write,args=(q,['url_4','url_5','url_6']))
proc_reader=Process(target=proc_read,args=(q,))
proc_writer1.start()
proc_writer2.start()
proc_reader.start()
proc_writer1.join()
proc_writer2.join()
proc_reader.terminate()
但是我一运行,问题就出来了:
Traceback (most recent call last):
File "queue2.py", line 24, in <module>
q=Queue()
File "/usr/lib/python3.7/multiprocessing/context.py", line 101, in Queue
from .queues import Queue
File "/usr/lib/python3.7/multiprocessing/queues.py", line 20, in <module>
from queue import Empty, Full
File "/home/view/code/python3/muti/queue.py", line 23
1 q=Queue()
(这里我又创建了一个queue2.py)
后来我阅读了这几个模块的源码,终于发现了问题所在,问题的关键就在于在multiprocessing这个包内的queues.py模块下的有一段代码:
from queue import Empty, Full
这里面的queue应该是系统模块queue.py文件
但是在这里由于python搜索包的机制是优先搜索本地文件,因此我自己创建的包queue.py被在queues.py初始化时导入而出了错
所以解决办法就是重命名queue.py
换一个别的名字
解决办法
重命名本地文件中的queue.py为别的名字。