Запустить команду оболочки с входными перенаправлениями из python 2.4?

То, что я хотел бы достичь, это запуск следующей команды оболочки:

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

Внутри python 2.4 script с чем-то непохожим:

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

Это происходит из-за использования символа перенаправления (я считаю) - mysql не получает входной файл.

Я также пробовал:

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

Не бегите туда эфир

Может ли кто-нибудь указать синтаксис для вызова оболочки, чтобы я мог подавать файл в перенаправление файлов?

Спасибо заранее.

Ответ 1

Вы должны подать файл в mysql stdin самостоятельно. Это должно сделать это.

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

Ответ 2

Символ < имеет этот смысл (например, чтение файла на stdin) только в оболочке. В Python вы должны использовать одно из следующих значений:

1) Прочитайте содержимое файла в своем процессе и нажмите его на stdin дочернего процесса:

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

2) Прочитайте содержимое файла через оболочку (как вы упомянули), но переадресовываете stdin вашего процесса соответственно:

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

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

Ответ 3

Как правильно заметил Андрей, оператор перенаправления < интерпретируется оболочкой. Отсюда и другое возможное решение:

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

Это работает, потому что os.system передает свой аргумент оболочке.

Обратите внимание, что я предположил, что все используемые переменные поступают из надежного источника, иначе вам нужно проверить их, чтобы предотвратить выполнение произвольного кода. Также эти переменные не должны содержать пробелов (значение по умолчанию IFS) или специальные символы оболочки.