Ответ 1
Вы должны подать файл в mysql stdin самостоятельно. Это должно сделать это.
import subprocess
...
filename = ...
cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName]
f = open(filename)
subprocess.call(cmd, stdin=f)
То, что я хотел бы достичь, это запуск следующей команды оболочки:
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)
Не бегите туда эфир
Может ли кто-нибудь указать синтаксис для вызова оболочки, чтобы я мог подавать файл в перенаправление файлов?
Спасибо заранее.
Вы должны подать файл в mysql stdin самостоятельно. Это должно сделать это.
import subprocess
...
filename = ...
cmd = ["mysql", "-h", ip, "-u", mysqlUser, dbName]
f = open(filename)
subprocess.call(cmd, stdin=f)
Символ <
имеет этот смысл (например, чтение файла на 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
Как правильно заметил Андрей, оператор перенаправления <
интерпретируется оболочкой. Отсюда и другое возможное решение:
import os
os.system("mysql -h " + ip + " -u " + mysqlUser + " " + dbName)
Это работает, потому что os.system
передает свой аргумент оболочке.
Обратите внимание, что я предположил, что все используемые переменные поступают из надежного источника, иначе вам нужно проверить их, чтобы предотвратить выполнение произвольного кода. Также эти переменные не должны содержать пробелов (значение по умолчанию IFS
) или специальные символы оболочки.