提交 8f549e6f authored 作者: James Bergstra's avatar James Bergstra

Merge pull request #739 from nouiz/import_path

refine the logic of importing the cutils_ext, in response to a bug reported to theano-dev by usaar33 on June 29, 2012.
import os, sys
import os
import sys
from compilelock import get_lock, release_lock
from theano import config
# TODO These two lines may be removed in the future, when we are 100% sure
# noone has an old cutils_ext.so lying around anymore.
if os.path.exists(os.path.join(config.compiledir,'cutils_ext.so')):
os.remove(os.path.join(config.compiledir,'cutils_ext.so'))
if os.path.exists(os.path.join(config.compiledir, 'cutils_ext.so')):
os.remove(os.path.join(config.compiledir, 'cutils_ext.so'))
# Ensure no-one else is currently modifying the content of the compilation
# directory. This is important to prevent multiple processes from trying to
# compile the cutils_ext module simultaneously.
try:
# If we load a previously-compiled version, config.compiledir should
# be in sys.path.
if config.compiledir not in sys.path:
sys.path.append(config.compiledir)
from cutils_ext.cutils_ext import *
except ImportError:
import cmodule
get_lock()
try:
try:
# We must retry to import it as some other processs could
# have been compiling it between the first failed import
# and when we receive the lock
from cutils_ext.cutils_ext import *
except ImportError:
import cmodule
code = """
def compile_cutils():
"""Do just the compilation of cutils_ext"""
code = """
#include <Python.h>
extern "C"{
static PyObject *
......@@ -66,15 +48,42 @@ except ImportError:
}
"""
loc = os.path.join(config.compiledir, 'cutils_ext')
if not os.path.exists(loc):
os.mkdir(loc)
loc = os.path.join(config.compiledir, 'cutils_ext')
if not os.path.exists(loc):
os.mkdir(loc)
args = cmodule.GCC_compiler.compile_args()
cmodule.GCC_compiler.compile_str('cutils_ext', code, location=loc,
preargs=args)
try:
# Must be at the beginning to ensure no conflict with other project
# that would use the same module name.
sys.path.insert(0, config.compiledir)
try:
from cutils_ext.cutils_ext import *
except ImportError:
import cmodule
get_lock()
# Ensure no-one else is currently modifying the content of the compilation
# directory. This is important to prevent multiple processes from trying to
# compile the cutils_ext module simultaneously.
try:
try:
# We must retry to import it as some other processs could
# have been compiling it between the first failed import
# and when we receive the lock
from cutils_ext.cutils_ext import *
except ImportError:
import cmodule
args = cmodule.GCC_compiler.compile_args()
cmodule.GCC_compiler.compile_str('cutils_ext', code, location=loc,
preargs=args)
from cutils_ext.cutils_ext import *
compile_cutils()
from cutils_ext.cutils_ext import *
finally:
# Release lock on compilation directory.
release_lock()
finally:
# Release lock on compilation directory.
release_lock()
finally:
if sys.path[0] == config.compiledir:
del sys.path[0]
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论