python - 意外的导入行为 : non-existing module imported

标签 python pip pytorch setuptools

我有一个 torch 扩展(但我​​认为我得到的错误与 torch 无关),我们称之为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

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

<小时/>

编辑。我检查了 sys.path,发现我的 conda 环境中有一个文件夹包含带有 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 支持进行编译。是否有一些缓存被调用?

最佳答案

事实证明,GPU 内置已由 setuptools(build/dist/ 等)缓存并已安装!

关于python - 意外的导入行为 : non-existing module imported,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57968883/

相关文章:

python 多处理池.starmap 不起作用

python - 如何从 QNetworkCookieJar 转换为字符串 dict 或 requests.cookie?

pytorch - 并行模拟 torch.nn.Sequential 容器

python - 如何使用单元测试作为可执行入口 pip 分发 python 包?

Python google cloud function部署失败-Madmom pip包

machine-learning - Pytorch 中 GRU 单元的隐藏和输出是否相同?

python - 使用 Huggingface Trainer 与分布式数据并行

python - 无法从 Python 进程中返回 append 值

python - Linkedin 身份验证提供无效的 redirect_uri

python - 如何构建依赖大型系统库的Python包