我似乎遇到了问题。我有一个视图,我可以允许员工用户下载该程序的MySQL数据库,但它根本不工作。我收到一条错误,上面写着Errno 2] No such file or directory: '/usr/local/src/djcode/c2duo_mms/backup.gz'
。
我不知道为什么会收到错误,但可能的答案是因为我无法正确转储数据库。它找不到backup.gz,因为它无法找到该文件因为它应该转储文件的步骤不起作用。
views.py
@login_required
def dbbackup(request):
if not (request.user.is_authenticated() and request.user.is_staff):
raise http.Http404
os.popen3("mysqldump -u *username* -p*password* *database* > /usr/local/src/djcode/c2duo_mms/backup.sql")
os.popen3("gzip -c /usr/local/src/djcode/c2duo_mms/backup.sql > /usr/local/src/djcode/c2duo_mms/backup.gz"
dataf = open('/usr/local/src/djcode/c2duo_mms/backup.gz', 'r')
return HttpResponse(dataf.read(), mimetype='application/x-gzip')
编辑:我试过运行一个小的python脚本。现在下面的python文件工作(在c2duo_mms目录中保存名为backup.gz的文件)。那么为什么我不能在我的views.py文件中做同样的事情!?
#!/usr/bin/env python
import os
os.popen3("mysqldump -u *username* -p*password* *database* > /usr/local/src/djcode/c2duo_mms/backup.sql")
os.popen3("gzip -c /usr/local/src/djcode/c2duo_mms/backup.sql > /usr/local/src/djcode/c2duo_mms/backup.gz")
答案 0 :(得分:1)
在此处使用完整路径:
os.popen3("mysqldump --add-drop-table -u " + settings.DATABASE_USER + " -p" + settings.DATABASE_PASSWORD + " " + settings.DATABASE_NAME + " > backup.sql")
即。你在哪里保存sql。
答案 1 :(得分:0)
Popen打开一个进程,但它不会在它周围创建一个shell。由于我不期望有一个中间shell,所以我不希望那里的重定向会被解释。 Popen确实将文件句柄返回到进程内/进程中的各种流 - 如果没有重定向,它将是stdout。
如果您阅读并存储这些管道句柄中的内容,您可以在python代码中进行重定向。
也许您可以考虑子流程模块 - http://docs.python.org/library/subprocess.html - 并且您可以指定要使用的shell,然后可以解释重定向。
答案 2 :(得分:0)
尝试这样的事情:
import subprocess
command = "mysqldump -u *username* -p*password* *database* > /usr/local/src/djcode/c2duo_mms/backup.sql"
p = subprocess.Popen(command, shell=True, bufsize=0, stdout=subprocess.PIPE, universal_newlines=True)
p.wait()
output = p.stdout.read()
p.stdout.close()
var“output”将允许您访问命令中的任何错误消息。
答案 3 :(得分:0)
网络服务器作为与root不同的用户运行(它需要相同),因此我没有权限保存在该文件夹中。我将我想要保存的文件夹的所有权更改为现在已经有效。
chown -R "apache" c2duo_mms