1 回答
TA贡献1829条经验 获得超13个赞
你的激活脚本是什么样的?它的主要目的是在 PATH 的开头插入 Python。
这是我的:
VIRTUAL_ENV="/Users/myuser/kds2/py2/venv38"
export VIRTUAL_ENV
_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
在运行之前activate,我的 PATH 中有这个(我使用实用程序将其逐行分割):
0 /Users/myuser/.cargo/bin
1 /Users/myuser/.nvm/versions/node/v10.15.0/bin
2 /opt/local/bin
激活后
0 /Users/myuser/kds2/py2/venv38/bin
1 /Users/myuser/.cargo/bin
2 /Users/myuser/.nvm/versions/node/v10.15.0/bin
所以,基本上,它所做的一切都是在 PATH 上加上前缀$VIRTUAL_ENV/bin
我建议你看一下激活并尝试看看它的作用。$VIRTUAL_ENV 有什么问题吗?它确实被硬编码到激活位置。
printf "\n$VIRTUALENV:$VIRTUALENV:\n"可能会给你一个线索,了解正在发生的事情。
VIRTUALENV=$(fnp $BASH_SOURCE/../..)同样可以做到这一点,
现在,接下来是你的实际目录是什么样的:
如果我在cdvenv 的正上方,我有这样的树结构:
tree -d -L 2 venv
venv
├── bin
│ └── __pycache__
├── cx_Oracle-doc
├── include
├── lib
│ └── python3.6
├── man
│ └── man1
└── share
├── doc
├── jupyter
└── man
现在,你的可能会有所不同。3.6可能是我的剩余。但有一个目录结构,里面充满了文件。
让我们cd进入 bin,即 activate-ion 之后我的第一个 PATH 条目
和ls -l python
(venv38) myuser@bin$ ls -l python
lrwxr-xr-x 1 myuser staff 9 May 29 13:15 python -> python3.8
这只是为了使其与版本无关。
让我们ls -l python3.8
lrwxr-xr-x 1 myuser staff 73 May 29 13:15 python3.8 -> /opt/local/Library/Frameworks/Python.framework/Versions/3.8/bin/python3.8
这就是 macports 放置 Python 的地方。如果你使用brew,它应该在类似的地方/usr/local/(我认为)。
是的,我可以启动它:
(venv38) myuser@bin$ python3.8
Python 3.8.1 (default, Jan 5 2020, 21:32:35)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
现在,其中任何一项都可能失败,但需要通过步骤来验证发生了什么:
正在设置路径
venv/bin 内容
实际的 Python 被指向 venv/bin
然后你就可以推理出问题的原因。
而且,如果您想知道的是 3.7 与 3.8 的项目,也许您可以在那时rm python
修复ln -s /usr/local/opt/python/bin/python3.8 python
。
但在执行此操作之前,请查看 python 的时间戳,该时间戳可能指向 3.7。符号链接带有链接创建的时间。这敲响了警钟吗?你当时安装了什么东西吗?也许与点有关?
现在,我已经让 Python 3.6/3.7/3.8 共存了,基本上没有问题。但如果可以的话,也许可以考虑标准化 1 个版本,除非你的 venv 稳定了?
添加回答
举报