Я хотел бы выполнить определенную версию mysqld через Python для модульного тестирования. Идея состоит в том, чтобы выполнить сервер по потоку, протестировать и убить сервер, когда это будет сделано. (Аналогично testing.mysqld, который, к сожалению, не работает на Windows.). Это текущий код:Запуск временного сервера MySQL с Python
#Create a temporary folder.
base_path = tempfile.mkdtemp()
#Extract the default files
zipfile.ZipFile(r"O:\Tools\mysql\min_mysql.zip").extractall(base_path)
#Setup my_ini file
my_ini_path = os.path.join(base_path, "my.ini").replace("\\", "/")
unix_base_path = posixpath.normpath(base_path).replace("\\", "/")
with open(my_ini_path, 'r') as my_ini:
filedata = my_ini.read()
filedata = filedata.replace("{{basedir}}", unix_base_path)
with open(my_ini_path, 'w', 0) as my_ini:
my_ini.write(filedata)
#Open mysqld
args = r"O:/Tools/mysql/bin/mysqld.exe --defaults-file=\"%s\"" % (my_ini_path)
args = shlex.split(args)
mysqld_process = subprocess.Popen(args, shell=True)
mysqld_process.wait()
Но если я исполню ее с помощью Python, я получаю эту ошибку:
Could not open required defaults file:
"c:\users\pelfeli1\appdata\local\temp\tmp2vct38\my.ini"
Fatal error in defaults handling. Program aborted
До сих пор я проверить, что файл существует до начала процесса. Если я напечатаю команду дословно и ее выполним, сервер будет работать нормально.
Кажется, что разница между Popen и просто выполнением в оболочке. Что мне не хватает?
Я не думаю, что это проблема, но строка 'args' не должна быть определена как raw (с' r'). Вместо этого сделайте следующее: '' O: /Tools/mysql/bin/mysqld.exe --defaults-file = "% s" ''(т. Е. Использовать одинарные кавычки). Если вы не собираетесь передавать обратную косую черту в командную строку –
Ну, это странно. Я вообще удалил «r» и котировки. Это сработало. Сервер запускается. Я понятия не имею, почему, поскольку он все еще работает с котировками на CMD. Я ненавижу это чувство. –