一个简单的 flask 下载页面,传入 url ,服务器下载。
部署 nohup python main.py &
    cmd = 'wget {} -O /home/opc/video/{}'
    command = cmd.format(link, filename)
    try:
        p = subprocess.Popen(command.split(), shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    except Exception as e:
        return False
    else:
        p.wait()
        print(p.stdout.read().decode())
        return True
        
现象: 期待: 调用 wget 下载,等下载完了才会返回 ret 给前端页面。 因为有 p.wait()
如果不用 nuhup 放在后台,的确是这样,会等待下载结束后才 返回给前端。
可是用了 nohup 之后,下载进程没有进行,直接就返回了,没看到任何报错。
请问有 v 友知道的吗?
|      1yagamil OP 找到问题了: subprocess.Popen(command.split(), shell=True, 这里的 shell 应该为 False | 
|      2jiangpranay      2022-10-10 16:37:53 +08:00 shell true , false 的意义是? | 
|      3julyclyde      2022-10-10 17:04:21 +08:00 | 
|  |      4SmallXeon      2022-10-10 17:36:20 +08:00 subprocess 里头,如果 cmd.split 了就不要 shell=True 了。 个人经验上给 subprocess 传入 cmd.split 是用来确保参数安全不被命令注入用的。 而在要确保 cmd 的完整执行的场景时(例如包含管道或多条命令拼接时),就不要 cmd.split ,并且传入 shell=True 。 | 
|      5tfdetang      2022-10-10 17:39:23 +08:00 是啊,为什么要用 shell 命令来解决这个问题呢? | 
|  |      6webcape233      2022-10-10 19:28:09 +08:00 via iPhone 你可以用 py 的下载库啊 ,那怕是 curl ,也有的吧 | 
|      7wxf666      2022-10-10 19:28:23 +08:00 为嘛不能用 request 、aiohttp 等库,在 Python 里下载呢? | 
|  |      8ch2      2022-10-10 20:12:12 +08:00 有没有一种可能,wget 是一个 python 的包 | 
|  |      10huangzhiyia      2022-10-10 20:29:50 +08:00 我觉得用 wget 挺好的,不用处理异常失败重试添加参数就好了,不用写额外的代码。 | 
|  |      11hsfzxjy      2022-10-10 20:44:03 +08:00 via Android 有可能你 url 里有&字符,被 shell 错误解析了 |