【发布时间】:2015-11-27 20:55:48
【问题描述】:
我想通过 Python 执行特定版本的 mysqld 进行单元测试。这个想法是在线程上执行服务器,测试并在完成后终止服务器。 (类似于testing.mysqld,遗憾的是它不适用于 Windows。)。这是当前代码:
#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 和仅在 shell 中执行之间似乎存在差异。我错过了什么?
【问题讨论】:
-
我不认为这是问题所在,但不应将
args字符串定义为原始字符串(使用r)。相反,这样做:'O:/Tools/mysql/bin/mysqld.exe --defaults-file="%s"'(即使用单引号)。除非您打算将反斜杠传递给命令行 -
嗯,这很奇怪。我完全删除了
r和引号。有效。服务器启动。我不知道为什么,因为它仍然适用于 CMD 上的引号。伙计,我讨厌那种感觉。
标签: python mysql python-2.7 mysql-python