popen 和 mysql 的 python 问题

标签 python mysql popen

我是 Python 的新手,多年来没有使用过 Linux,所以我不确定我在哪里纠结了。我正在尝试使用 Popen 在 Ubuntu 上的 MySQL 中运行 sql 文件。

相关代码如下:

command = ['mysql', '-uUSER', '-pPWD','-h192.168.1.132',  '--database=dbName', '<', './1477597236_foo.sql' ]
print("command is: "+subprocess.list2cmdline(command))

proc = subprocess.Popen(
    command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, cwd='.'
)

此输出与运行“mysql --help”时相同。令我费解的是,如果我将 subprocess.list2cmdline 的命令输出直接运行,它运行完美。另外,如果我更换 '< file.sql''-e select * from foo' ,它运行。所以,'<'和文件导致我的问题。我知道是什么导致了这个问题,但到目前为止我没有尝试解决它。​​

蒂亚,克雷格

最佳答案

当命令行中存在重定向或管道或内置命令时,shell=True 是必需的。然而,在像这样的简单情况下,shell=True 就有点矫枉过正了。为了避免 shell=True,有一种更简洁的方法可以更好地控制输入文件。

  • 如果输入文件不存在,在到达子进程之前会得到一个异常,这样更容易处理
  • 该进程在没有外壳的情况下运行:更好的可移植性和性能

代码:

command = ['mysql', '-uUSER', '-pPWD','-h192.168.1.132',  '--database=dbName' ]

with open('./1477597236_foo.sql') as input_file:
    proc = subprocess.Popen(
        command, stdin = input_file, stderr=subprocess.PIPE, stdout=subprocess.PIPE )
    output,error = proc.communicate()

(我添加了下一行应该是 communicate 调用:因为 stdout 和 stderr 都被重定向,这是避免两个输出流之间出现死锁的唯一简单方法)

关于popen 和 mysql 的 python 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40385009/

相关文章:

python - 检查 dict 中的键返回 false 即使键存在

python - 将RGB图像转换为黑白PIL手部识别

python - 给定一个 pandas 数据框,如何检查和计算行字符串是否位于一行嵌套列表内?

Python:如何窥视 pty 对象以避免阻塞?

Python 不区分大小写替换所有多个字符串

php - 检查条目并在不重复的情况下插入 PHP/SQL

mysql - 使用 openssl 加密字段过滤 MySQL 表

java - 从本地 mySQL 数据库移动到在线数据库时出现 IllegalStateException(使用 java hibernate)

python - 从另一个 Python 进程调用操作系统的 Python 可执行文件

python - shell=True 时如何确定 subprocess.Popen() 失败