Virtualenv在Windows上持续加载全局站点包

7

我在SO上找了一圈,但是我找到的答案还没有解决我的问题。

我想使用隔离的虚拟环境,但由于某种原因,在django的shell中,virtualenv仍然会加载全局的site packages……

我试着清理PATH变量,直到只剩下c:\Python26\Scripts和c:\Python26。然后我创建了我的环境。

virtualenv --distribute --no-site-packages myproject

我随后激活了虚拟环境。现在的 PATH 是(已删除不相关变量):
PATH=E:\Development\django_projects\myproject\Scripts;C:\Panda3D-1.7.0\python;C:\Panda3D-1.7.0\bin;c:\python26\Scripts;

PYTHONPATH=C:\Panda3D-1.7.0\

这是一个设置Python环境变量的命令,它告诉Python去哪里查找需要导入的模块。接下来,我启动Python...
>>> import django
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    ImportError: No module named django

让我们尝试一个我确定存在于 c:\python site-packages 目录中的模块。

>>> import BeautifulSoup
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named BeautifulSoup

太好了!没有全局网站包!那么我们继续下一个。从命令提示符中,我输入:

django-admin.py

然后它就能工作了!但是等等……我还没有安装Django。这怎么可能?

之后的事情更加奇怪……我首先将这些内容添加到virtualenv的activate.bat脚本中,以便Django可以找到我的设置。

set PYTHONPATH=E:\Development\django_projects\myproject\
set DJANGO_SETTINGS_MODULE=settings.development

现在我启动django-admin.py shell并且...
In [1]: import BeautifulSoup
In [2]: BeautifulSoup.__file__
Out[2]: 'C:\\Python26\\lib\\site-packages\\BeautifulSoup.pyc'

这怎么可能呢?

灵光一闪

在我打字的过程中,我突然明白了。.py是与我的c:\ python26 \ python.exe可执行文件配对的文件扩展名,而不是虚拟环境的扩展名!

python manage.py
Traceback (most recent call last):
  File "manage.py", line 2, in <module>
    from django.core.management import execute_manager
ImportError: No module named django.core.management

嘿。有没有人知道如何将.py文件扩展名与我的虚拟环境的Python可执行文件关联起来,而不是系统定义的Python可执行文件?


如何将.py文件扩展名与我的虚拟环境中的Python可执行文件连接起来?请参阅:为什么Windows上的virtualenv不会将.py/.pyw/.pyo/.pyc文件与virtualenv的Python可执行文件版本关联起来?单个cmd.exe会话的临时文件关联 - Piotr Dobrogost
3个回答

11

一些额外的批处理技巧可以轻松解决这个问题。我的标准添加到 activate.bat 的内容如下:

REM custom venv settings
set PYTHONPATH=%\VIRTUAL_ENV%;%\VIRTUAL_ENV%\conf;%\VIRTUAL_ENV%\apps
set DJANGO_SETTINGS_MODULE=settings

ftype Python.File=%VIRTUAL_ENV%\Scripts\python.exe %1 %*

以及deactivate.bat

REM restore ftype
ftype Python.File=C:\tools\Python27\python.exe %1 %*

在下面这行代码 "set PYTHONPATH=%\VIRTUAL_ENV%;%\VIRTUAL_ENV%\conf;%\VIRTUAL_ENV%\apps" 中有一些额外的 \ 字符吗?难道它不应该写成 "set PYTHONPATH=%VIRTUAL_ENV%;%VIRTUAL_ENV%\conf;%VIRTUAL_ENV%\apps"? - Nathan
1
此外,在Windows批处理文件中,您需要为ftype命令转义%字符。 "ftype Python.File = C:\ tools \ Python27 \ python.exe%1%%*" - Nathan
当我运行ftype命令时,我收到一个错误提示:“拒绝访问。处理过程中发生错误:Python.File。” - Dan Benamy

0
你可以创建一个 .bat 文件并在其中修改 PATH 和 PYTHONPATH,然后从该 .bat 文件运行 .py。 类似于这样的东西:
set PATH=C:\Python26; python myfile.py
当然,您可以将任何其他内容添加到您的路径中。

0

我在使用cmd.exe时,在我的Windows 7设置中与m0nonoke的答案一样遇到了“访问被拒绝”的问题。

但是我找到了这个解决方法,使用替代shellTCC/LE和自定义启动文件...

Under working directory create subdirectory config. In this directory create startup file for TCC/LE called tcstart.btm

@echo off
rem Override system python binding to handle virtualenvironments
set .py;.pyc=python.exe

Now create (copy) TCC/LE shortcut on desktop and rename it appropriately. Open Properties for shortcut and add to Target “C:\django\config\tcstart.btm”. You probably want to set Start in to something useful, like C:\django

在安装Django和Windows方面,本指南提供了解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接