提交 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 compilelock import get_lock, release_lock
from theano import config from theano import config
# TODO These two lines may be removed in the future, when we are 100% sure # 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. # noone has an old cutils_ext.so lying around anymore.
if os.path.exists(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')) 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
def compile_cutils():
"""Do just the compilation of cutils_ext"""
code = """ code = """
#include <Python.h> #include <Python.h>
extern "C"{ extern "C"{
...@@ -73,8 +55,35 @@ except ImportError: ...@@ -73,8 +55,35 @@ except ImportError:
args = cmodule.GCC_compiler.compile_args() args = cmodule.GCC_compiler.compile_args()
cmodule.GCC_compiler.compile_str('cutils_ext', code, location=loc, cmodule.GCC_compiler.compile_str('cutils_ext', code, location=loc,
preargs=args) 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
compile_cutils()
from cutils_ext.cutils_ext import * from cutils_ext.cutils_ext import *
finally: finally:
# Release lock on compilation directory. # Release lock on compilation directory.
release_lock() release_lock()
finally:
if sys.path[0] == config.compiledir:
del sys.path[0]
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论