Maison  >  Questions et réponses  >  le corps du texte

Comment résoudre le problème de l'exécution de commandes bash nécessitant un mot de passe en Python

J'écris une fonction Python qui doit exporter une base de données MySQL vers un fichier .sql à l'aide de bash. J'utilise la commande mysqldump.

mysqldump -u bandana -p movies > /Users/Mac/Downloads/testOutput.sql

Cette commande fonctionne assez bien pour mes besoins. Ma question est de savoir comment convertir cela en un script Python pouvant être exécuté à partir d'une fonction.

J'ai essayé d'utiliser os.system, mais cela nécessite un mot de passe dans le terminal pendant le fonctionnement.

def cloneDB():
    os.system("mysqldump -u bandana -p movies > /Users/Tis_Me/Downloads/testOutput.sql")

输入密码:

J'ai également essayé d'utiliser le module de sous-processus, mais je n'y connais rien. Je reçois juste quelques erreurs que je ne sais pas comment corriger.

def cloneDB():
    subprocess.run(["mysqldump", "-u bandana", "-p movies", "> /Users/Tis_Me/Downloads/testOutput.sql"])

Je me demandais s'il y avait des paramètres supplémentaires ou quelque chose d'autre que je pourrais ajouter pour saisir automatiquement le mot de passe afin que la fonction n'ait pas besoin de demander le mot de passe.

Le résultat souhaité est que la fonction cloneDB() s'exécute sans demander de mot de passe.

P粉476046165P粉476046165211 Il y a quelques jours570

répondre à tous(1)je répondrai

  • P粉647504283

    P粉6475042832024-03-23 10:40:23

    Vous pouvez mettre le mot de passe directement dans la ligne de commande, immédiatement après -p

    Vous ne pouvez pas non plus mettre la redirection de sortie dans la liste des paramètres. C'est la syntaxe du shell, pas les paramètres de commande. Vous pouvez utiliser l'option subprocess.run()stdout pour rediriger sa sortie.

    def cloneDB():
        password = "something"
        with open("/Users/Tis_Me/Downloads/testOutput.sql", "w") as sqlfile:
            subprocess.run(["mysqldump", "-u", "bandana", f"-p{password}", "movies"], stdout=sqlfile)

    répondre
    0
  • Annulerrépondre