J'ai un problème pour essayer de créer un script de base de données de sauvegarde/mise à niveau facile.Sous-processus Python, mysqldump et tuyaux
L'erreur est dans l'appel à l'aide mysqldump subprocess:
cmdL = ["mysqldump", "--user=" + db_user, "--password=" + db_pass, domaindb + "|", "gzip", ">", databases_path + "/" + domaindb + ".sql.gz"]
print "%s: backup database %s \n\t[%s]" % (domain, domaindb, ' '.join(cmdL))
total_log.write("%s: backup database %s \n\t[%s] \n" % (domain, domaindb, ' '.join(cmdL)))
p = subprocess.Popen(cmdL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
Avant que cose, rediriger sys.stdout
et sys.stderr
aux fichiers, afin d'avoir un système de journal.
Dans ces journal, je trouve l'erreur:
[mysqldump --user = xxxxxx --password = YYYYYYYY bdd | gzip> /home/drush-backup/2010-08-30.15.37/db/database_name.sql] [Erreur]: mysqldump: Impossible de trouver la table: "|"
Semblez que le caractère |
est vu comme un argument mysqldump, à la place comme un tuyau. En regardant la documentation du sous-processus python, c'est normal, mais comment puis-je obtenir ce dont j'ai besoin (appelez la commande mysqldump --user=xxxxxx --password=yyyyyyyy database_name | gzip > /home/drush-backup/2010-08-30.15.37/db/database_name.sql
)?
EDIT Je viens de voir cet exemple sur docs python:
output=`dmesg | grep hda`
==>
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
et j'ai modifier mon script:
command = ["mysqldump", "--user=" + db_user, "--password=" + db_pass, domaindb, "|", "gzip", ">", databases_path + "/" + domaindb + ".sql.gz"]
cmdL1 = ["mysqldump", "--user=" + db_user, "--password=" + db_pass, domaindb]
cmdL2 = ["gzip", ">", databases_path + "/" + domaindb + ".sql.gz"]
print "%s: backup database %s \n\t[%s]" % (domain, domaindb, ' '.join(command))
total_log.write("%s: backup database %s \n\t[%s] \n" % (domain, domaindb, ' '.join(command)))
p1 = subprocess.Popen(cmdL1, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
p2 = subprocess.Popen(cmdL2, stdin=p1.stdout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
cmdError, cmdData = p2.communicate()
maintenant la variable de commande est simplement utilisée pour plus de commodité dans les journaux.
Cette aller une étape suivante, mais il arrête le flux >
, avec cette erreur:
[Error]: gzip: >: No such file or directory
gzip: /path/to/backups/dir/natabase_name.sql.gz: No such file or directory
Il est évident que, si je tente la commande dans un terminal cela fonctionne.
Les virgules ajouter un espace, mais le signe plus ne fait pas. domaindb et le tuyau sont joints avec un plus. Peut-être que c'est le problème? Vous ne savez pas pourquoi vous joignez des chaînes avec des virgules plutôt que d'utiliser simplement des espaces et de les conserver dans les mêmes guillemets. – xnine
Soit im newbie en python;) de toute façon, je pense que je dois utiliser le +, car il ne doit pas y avoir d'espace entre '--user =' et l'utilisateur db .. la forme correcte devrait être '--user = foo', ou est-ce que je me trompe? – Strae