意外的导入行为:导入了不存在的模块

时间:2019-09-17 06:57:53

标签: python pip pytorch setuptools

我有一个割炬扩展名(但我认为我得到的错误与割炬无关),我们将其称为foo,它是由setuptools构建的。但是,这取决于系统中是否有GPU,在这种情况下,会编译一些CUDA代码:

from torch.utils.cpp_extension import CppExtension, BuildExtension, CUDAExtension

if cuda_available:
    ext = CUDAExtension(
            'foo_gpu',
            prefixed(prefix, ['foo.cpp', 'foo_kernel.cu']),
            define_macros=[('COMPILE_CUDA', '1')])
else:
    ext = CppExtension(
            'foo_cpu',
            prefixed(prefix, ['foo.cpp']))

setup(name=ext.name,
      version='1.0.0',
      ext_modules=[ext_module],
      extra_compile_args=['-mmacosx-version-min=10.9'],
      cmdclass={'build_ext': BuildExtension})

注意如何将模块编译为foo_gpufoo_cpu

稍后,我将其导入如下:

try:
    import foo_gpu as foo_backend
    CUDA_SUPPORTED = True
except ImportError:
    CUDA_SUPPORTED = False
    # Try importing the cpu version
    try:
        import foo_cpu as foo_backend
    except ImportError:
        ...

假设我在CUDA支持下进行了编译,因此foo_gpu进入了PIP(实际上以foo-gpu的形式进入PIP,不确定为什么吗?)

现在,我卸载了pip uninstall foo-gpu,并仅在CPU支持下对其进行了编译,并且pip显示foo-cpu 1.0.0

BUT ,现在,当我运行上面的导入代码时,它仍然会找到foo-gpu,即第一个import语句成功!即使它没有显示在pip中。


编辑。我检查了sys.path,发现在conda env中有一个包含gpu的文件夹:

$ ls ~/miniconda3/envs/cpu_env/lib/python3.7/site-packages/foo_cpu-1.0.0-py3.7-linux-x86_64.egg/ 
 EGG-INFO
 __pycache__
 foo_cpu.cpython-37m-x86_64-linux-gnu.so
 foo_cpu.py
 foo_gpu.cpython-37m-x86_64-linux-gnu.so

但是它应该如何到达那里?在这个环境(cpu_env中,我从未使用GPU支持进行编译。是否有一些缓存被调用?

1 个答案:

答案 0 :(得分:0)

结果证明内置的GPU已由setuptools(build/dist/等)缓存并安装!