如何在 Python 2.4 中运行带输入重定向的 shell 命令?

12 投票
3 回答
8415 浏览
提问于 2025-04-16 03:55

我想要实现的是在下面这个命令行中启动一个shell命令:

mysql -h hostAddress -u userName -p userPassword 
databaseName < fileName

这个命令是在一个Python 2.4的脚本中运行的,写法大概是这样的:

cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName, "<", file]
subprocess.call(cmd)

但是这个方法出错了,我觉得是因为使用了重定向符号,导致mysql没有接收到输入文件。

我也试过其他的方法:

subprocess.call(cmd, stdin=subprocess.PIPE)

但是也不行。

有没有人能告诉我正确的语法,怎么在shell调用中使用文件重定向?

提前谢谢大家。

3 个回答

0

正如安德烈正确指出的,< 重定向操作符是由命令行解释的。因此,还有另一种可能的解决方案:

import os
os.system("mysql -h " + ip + " -u " + mysqlUser + " " + dbName)

之所以能工作,是因为 os.system 会把它的参数传递给命令行。

需要注意的是,我假设所有使用的变量都是来自可信的来源,否则你需要对它们进行验证,以防止任意代码执行。此外,这些变量不应该包含空格(默认的 IFS 值)或命令行特殊字符。

5

符号 < 只有在 shell 中才有这个意思(也就是把文件内容读入 stdin)。在 Python 中,你应该使用以下两种方法之一:

1) 在你的程序中读取文件内容,然后把它传给子进程的 stdin

fd = open(filename,  'rb')
try:
    subprocess.call(cmd, stdin=fd)
finally:
    fd.close()

2) 通过 shell 读取文件内容(就像你提到的那样),但要相应地重定向你程序的 stdin

# In file myprocess.py
subprocess.call(cmd, stdin=subprocess.PIPE)

# In shell command line
$ python myprocess.py < filename
11

你需要自己把文件输入到mysql的标准输入中。这样做就可以了。

import subprocess
...
filename = ...
cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName]
f = open(filename)
subprocess.call(cmd, stdin=f)

撰写回答