python popen 和 mysql 问题
python issue with popen and mysql
我是 Python 的新手,并且已经多年没有使用 Linux,所以我不确定我在哪里纠结了。我正在尝试对 Ubuntu 上 MySQL 中的 运行 sql 文件使用 Popen。
相关代码如下:
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'
,它会 运行s。因此,'<'
和文件导致了我的问题。我知道是什么导致了这个问题,但到目前为止我没有尝试解决它。
蒂亚,克雷格
因此您需要将 shell=True
添加到您的 Popen
调用中。 <
是 shell 的一部分,如果没有该参数,您将无法使用 shell 功能。
proc = subprocess.Popen( command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, cwd='.',shell=True )
当命令行中存在重定向或管道或内置命令时,需要 shell=True
。然而,在像这样的简单情况下,shell=True
就有点矫枉过正了。为了避免 shell=True
,有一种更简洁的方法可以更好地控制输入文件。
- 如果输入文件不存在,在到达子进程之前得到一个异常,这样更容易处理
- 进程在没有 shell 的情况下运行:更好的可移植性和性能
代码:
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 都被重定向,这是避免两个输出流之间出现死锁的唯一简单方法)
我是 Python 的新手,并且已经多年没有使用 Linux,所以我不确定我在哪里纠结了。我正在尝试对 Ubuntu 上 MySQL 中的 运行 sql 文件使用 Popen。
相关代码如下:
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'
,它会 运行s。因此,'<'
和文件导致了我的问题。我知道是什么导致了这个问题,但到目前为止我没有尝试解决它。
蒂亚,克雷格
因此您需要将 shell=True
添加到您的 Popen
调用中。 <
是 shell 的一部分,如果没有该参数,您将无法使用 shell 功能。
proc = subprocess.Popen( command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, cwd='.',shell=True )
当命令行中存在重定向或管道或内置命令时,需要 shell=True
。然而,在像这样的简单情况下,shell=True
就有点矫枉过正了。为了避免 shell=True
,有一种更简洁的方法可以更好地控制输入文件。
- 如果输入文件不存在,在到达子进程之前得到一个异常,这样更容易处理
- 进程在没有 shell 的情况下运行:更好的可移植性和性能
代码:
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 都被重定向,这是避免两个输出流之间出现死锁的唯一简单方法)