一个简单的 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 友知道的吗?
1
yagamil OP 找到问题了:
subprocess.Popen(command.split(), shell=True, 这里的 shell 应该为 False |
2
jiangpranay 2022-10-10 16:37:53 +08:00
shell true , false 的意义是?
|
3
julyclyde 2022-10-10 17:04:21 +08:00
|
4
SmallXeon 2022-10-10 17:36:20 +08:00
subprocess 里头,如果 cmd.split 了就不要 shell=True 了。
个人经验上给 subprocess 传入 cmd.split 是用来确保参数安全不被命令注入用的。 而在要确保 cmd 的完整执行的场景时(例如包含管道或多条命令拼接时),就不要 cmd.split ,并且传入 shell=True 。 |
5
tfdetang 2022-10-10 17:39:23 +08:00
是啊,为什么要用 shell 命令来解决这个问题呢?
|
6
webcape233 2022-10-10 19:28:09 +08:00 via iPhone
你可以用 py 的下载库啊 ,那怕是 curl ,也有的吧
|
7
wxf666 2022-10-10 19:28:23 +08:00
为嘛不能用 request 、aiohttp 等库,在 Python 里下载呢?
|
8
ch2 2022-10-10 20:12:12 +08:00
有没有一种可能,wget 是一个 python 的包
|
10
huangzhiyia 2022-10-10 20:29:50 +08:00
我觉得用 wget 挺好的,不用处理异常失败重试添加参数就好了,不用写额外的代码。
|
11
hsfzxjy 2022-10-10 20:44:03 +08:00 via Android
有可能你 url 里有&字符,被 shell 错误解析了
|