използвайки subprocess.call с mysqldump

Правя скриптове с Windows от много години и едва през последните няколко седмици започнах да разглеждам Python като алтернатива. Опитвам се да напиша собствен скрипт на python за архивиране на mysql база данни с mysqldump. Обикновено правя това с команден ред, предаващ изхода > без проблем.

Виждам много отговори с subprocess.popen и shell=True, също така виждам много твърдения, че трябва да избягвам shell=True

Така че се опитвам да получа следния код, за да пренасоча моя stdout към файл, всичко без успех

sys.stdout=open("mysqldump.txt",'w')
print("testing line1")
subprocess.check_output(["mysqldump", "-u", "usernmae", "-ppassword", "-h", "dbserver_name", database_name])

Ако коментирам реда sys.sdout, виждам sqldump да се извежда на моя екран, така че знам, че имам правилния синтаксис за тази част. Добавих израза за печат и виждам, че това се записва във файла mysqldump.txt. Но когато се изпълнява изцяло, няма изхвърляне на екрана или файла

Някакви идеи? Опитвам се да избягвам използването на shell решение


person Rob    schedule 08.06.2014    source източник


Отговори (2)


Това, което се опитахте да направите, не работи, защото модифицирането на sys.stdout засяга само изрази на ниво Python като print, а не записи на по-ниско ниво от C и особено не тези, изпълнявани от външна програма. Искате да кажете на subprocess да създаде тръба, както направихте с пренасочването >, което върви по следния начин:

with open("mysqldump.txt",'w') as out:
    subprocess.check_call(["mysqldump", "-u", "usernmae", "-ppassword",
                           "-h", "dbserver_name", database_name],
                          stdout=out)
person user4815162342    schedule 08.06.2014
comment
Какво е dbserver_name? localhost ли е? - person OPV; 13.11.2017
comment
@OPV Вероятно това е името на хоста на сървъра, където работи db. Аргументите към mysqldump бяха копирани от въпроса, ще трябва да попитате OP (или да се консултирате с документацията) за тяхното значение. - person user4815162342; 13.11.2017

Можете ли да използвате аргумента --result-file=file за mysqldump?

може да се наложи да промените check_output на subprocess.call, за да завърши това.

or

subprocess.call(["mysqldump", "-u", "usernmae", "-ppassword", "-h", "dbserver_name", database_name],stdout=open('myfile.txt','w'))

редактиране: myfile.txt ще се затвори след приключване на подпроцеса.

person jwillis0720    schedule 08.06.2014
comment
Благодаря, това също проработи. Два страхотни отговора, прекарах толкова време, опитвайки всякакви методи - person Rob; 08.06.2014
comment
Имам нужда от репутация 15 :-( все още нов в stackoverflow - person Rob; 10.06.2014