if name == "main" 函数里的多进程不执行

发布于 2022-09-11 21:04:27 字数 1705 浏览 19 评论 0

背景:一个进程池处理下载图片,但是下载图片的这个函数被略过了
代码如下

import os
import requests
from multiprocessing import Pool

imgss = [
'//img30.360buyimg.com/n1/s1280x960_jfs/t22603/212/2599271310/150344/e03347b3/5b87d725Na3a0fca9.jpg',
'//img30.360buyimg.com/n1/s1280x960_jfs/t23803/270/2660558588/150459/2048f327/5b87d730Na2cb6120.jpg',
'//img30.360buyimg.com/n1/s1280x960_jfs/t1/20773/31/6300/133150/5c4d1819Ee0c22d12/54cf06a8191e749a.jpg',
'//img30.360buyimg.com/n1/s1280x960_jfs/t1/52295/33/1509/216396/5cf3d0c0Ef51c7006/df16ec85a1e0e301.jpg']



def imgDown(img):
    '''download image and save to folder'''

    url = 'http:'+img
    imgName = img.split('/')[-1]
    r = requests.get(url, headers = headers)
    with open(os.getcwd()+r'\{}\{}'.format(title, imgName), 'ab+') as f:
        f.write(r.content)
    print('1 picture done!')

def checkDown(imgList):
    # checkD = input("是否需要下载产品图片?需要回复 'y' or 'Y': ")
    checkD = 'y'
    if checkD == 'y' or checkD == 'Y':
        os.mkdir(title)
        p = Pool(4)
        for i in imgList:
            p.apply_async(imgDown, args = (i,))
        p.close()
        p.join()

    else:
        pass



if __name__ == '__main__':
    title = 'product test'
    headers = {
    'accept-encoding': 'deflate, br',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    }
    checkDown(imgss)

一直在找问题,后面就直接结束了,有创建一个文件夹,但是里面图片一个都没有下到,我改了很多地方,后面发现把 参数 header 以及 参数 title 放到 if __name__ == "__main__": 的上面就可以了,但是我不懂,这个不是用来自己运行脚本和导入到其他脚本中的区别么,和上面这个是什么原因?

上面是脚本的一部分,其中的title是需要另外一个函数返回的,所以没办法放在上面去,有其他办法么?或者告诉我原因,谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

薄凉少年不暖心 2022-09-18 21:04:27

没看清题主问题,发了错误回答,抱歉

你放到 if __name__ == '__main__': 里面,它们就成了该 if 语句块的局部变量了,放外面才是整个文件可访问的变量

吃兔兔 2022-09-18 21:04:27

问题在于,multiprocessing模块启动的子进程中本模块名不是__main__而是__mp_main__,因此if __name__ == '__main__' 在这些进程中不成立,这些进程的上下文中也就不会有titleheaders变量了。
你可以具体描述一下你需要的titleheaders是怎么来的,我们再来看怎么解决。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文