首页 > 解决方案 > virtualenv 从错误的目录导入包

问题描述

在最近的 sublime 更新破坏了与 Virtualenv sublime 包的兼容性后,我决定切换到 VSCode。

我创建了另一个文件夹,我从 github 克隆了我的代码并设置了 VScode 工作区。

简化的文件结构如下所示(mypackage_wdir 是我在 sublime 中用于项目的目录):

├── mypackage_wdir
│   ├── dev_env
│   ├── mypackage
│   ├── mypackage_project.sublime-project
│   └── mypackage_project.sublime-workspace
├── mypackage_wdir_vs
│   ├── mypackage
│   └── mypackage_VS_workspace.code-workspace

我去了mypackage_wdir_vs,通过以下方式创建了一个虚拟环境。

virtualenv env_3.7

然后我激活了虚拟环境。

env_3.7\Scripts\activate

我去了 mypackage_wdir_vs/mypackage 并将其安装在 env_3.7 中:

pip install --editable .

我得到以下输出。

Obtaining file:///C:/Users/Krzysztof/OneDrive/mypackage_wdir_vs/mypackage
Collecting dill
  Using cached dill-0.3.4-py2.py3-none-any.whl (86 kB)
Collecting ezdxf
  Using cached ezdxf-0.16.6-cp37-cp37m-win_amd64.whl (1.2 MB)
Collecting numpy
  Using cached numpy-1.21.2-cp37-cp37m-win_amd64.whl (14.0 MB)
Collecting matplotlib
  Using cached matplotlib-3.4.3-cp37-cp37m-win_amd64.whl (7.2 MB)
Collecting pyparsing>=2.0.1
  Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
Collecting typing-extensions
  Using cached typing_extensions-3.10.0.2-py3-none-any.whl (26 kB)
Collecting python-dateutil>=2.7
  Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
Collecting kiwisolver>=1.0.1
  Using cached kiwisolver-1.3.2-cp37-cp37m-win_amd64.whl (51 kB)
Collecting pillow>=6.2.0
  Using cached Pillow-8.3.2-cp37-cp37m-win_amd64.whl (3.2 MB)
Collecting cycler>=0.10
  Using cached cycler-0.10.0-py2.py3-none-any.whl (6.5 kB)
Collecting six
  Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: six, typing-extensions, python-dateutil, pyparsing, pillow, numpy, kiwisolver, cycler, matplotlib, ezdxf, dill, mypackage
  Running setup.py develop for mypackage
Successfully installed cycler-0.10.0 dill-0.3.4 ezdxf-0.16.6 kiwisolver-1.3.2 matplotlib-3.4.3 numpy-1.21.2 pillow-8.3.2 mypackage-0.1.dev0 pyparsing-2.4.7 python-dateutil-2.8.2 six-1.16.0 typing-extensions-3.10.0.2

然后我在 vscode 中打开我的项目(工作区)并选择新创建的虚拟环境:

在此处输入图像描述

一切都应该正常工作,但是,我意识到当我在 VScode 中运行代码时,包是从天知道从哪里导入的,而不是从 C:\Users\Krzysztof\OneDrive\mypackage_wdir_vs\mypackage

我在测试文件中添加了以下几行,以查看它的来源:

import mypackage
print(mypackage.__file__)

我得到以下输出:

(env_37) PS C:\Users\Krzysztof\OneDrive\mypackage_wdir_vs> & c:/Users/Krzysztof/OneDrive/mypackage_wdir_vs/env_37/Scripts/python.exe c:/Users/Krzysztof/OneDrive/mypackage_wdir_vs/mypackage/mypackage/geometry/test/test_base.py
C:\Users\Krzysztof\OneDrive\mypackage_wdir\mypackage\mypackage\__init__.py
............................
----------------------------------------------------------------------
Ran 28 tests in 0.005s

OK
(env_37) PS C:\Users\Krzysztof\OneDrive\mypackage_wdir_vs>

mypackage_wdir\mypackage 是我以前在 sublime 中工作的旧文件夹。

如何让 virtualenv 或 vscode 从正确的文件夹中导入包(C:/Users/Krzysztof/OneDrive/mypackage_wdir_vs/mypackage 而不是 C:/Users/Krzysztof/OneDrive/mypackage_wdir/mypackage)?这里有什么问题?

文件结构为:

├── mypackage_wdir
│   ├── dev_env
│   ├── mypackage
│   ├── mypackage_project.sublime-project
│   └── mypackage_project.sublime-workspace
├── mypackage_wdir_vs
│   ├── env_3.7
│   ├── mypackage
│   └── mypackage_VS_workspace.code-workspace

我检查了 virtualenv 文件夹中的包和 C:\Users\Krzysztof\OneDrive\mypackage_wdir_vs\env_3.7\Lib\site-packages 中的 mypackage.egg-link 文件是正确的:

C:\Users\Krzysztof\OneDrive\mypackage_wdir_vs\mypackage
.

标签: pythonvisual-studio-codevirtualenv

解决方案


推荐阅读