gpt4 book ai didi

Python - subprocess.check_call 给出 CalledProcessError 异常

转载 作者:行者123 更新时间:2023-11-30 23:44:01 25 4
gpt4 key购买 nike

我想调用一个子进程来备份mysql数据库。在终端中运行良好的命令行(并创建了一个名为 mydatabase.sql 的文件)是:

    mysqldump -uroot -ppassword --add-drop-database --database mydatabase > mydatabase.sql

现在由 python 运行来调用子进程的代码:

    args = shlex.split('mysqldump -uroot -ppassword --add-drop-database --database mydatabase > mydatabase.sql')
subprocess.check_call(args)

引发异常(未创建文件):

    Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
subprocess.check_call(args)
File "/usr/lib/python3.2/subprocess.py", line 485, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['mysqldump', >'-uroot', '-ppassword', '--add-drop-database', '--database', >'mydatabase', '>', 'mydatabase.sql']' returned non-zero exit status 2

我已经尝试了不同的方法,但仍然不起作用:

    args = shlex.split('/opt/lampp/bin/mysqldump -uroot -ppassword --add-drop-database --database mydatabase > mydatabase.sql')
subprocess.check_call(args)

    args = shlex.split('/opt/lampp/bin/mysqldump -uroot -ppassword --add-drop-database --database mydatabase > mydatabase.sql')
subprocess.Popen(args)

我还尝试过使用 shell=True 或 shell=False。在这两种情况下,它们仍然不起作用。

我已阅读文档,谷歌搜索我的问题的答案,但我不知道如何显示我的问题。 stackoverflow 可能是我最后的希望。

最佳答案

这里的问题是重定向输出的方式。

  • 如果您将命令作为参数列表传递,则 ">" 将始终被解释为文字 >,无论您是否使用 shell =Trueshell=False
  • 如果您将命令作为单个字符串传递,那么它应该可以工作,但前提是您有 shell=True
  • 做你想做的事情的最好方法是将输出直接从 python 重定向到文件:

    args = shlex.split('/opt/lampp/bin/mysqldump -uroot -ppassword --add-drop-database --database mydatabase')
    output = open("mydatabase.sql", "w")
    subprocess.Popen(args, stdout=output)

关于Python - subprocess.check_call 给出 CalledProcessError 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10397791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com