我安装了一个包在虚拟环境里。如果我只启动Python解释器,那个包可以被成功导入。但是,如果我启动Idle,那个包无法被导入(因为它只存在于某一个特定的虚拟环境中而不是全局)。如何从虚拟环境中启动Idle,以便所有来自虚拟环境的包都可用?
我安装了一个包在虚拟环境里。如果我只启动Python解释器,那个包可以被成功导入。但是,如果我启动Idle,那个包无法被导入(因为它只存在于某一个特定的虚拟环境中而不是全局)。如何从虚拟环境中启动Idle,以便所有来自虚拟环境的包都可用?
python -m idlelib.idle
摘自这个答案。
本回答假设使用Python 3。
有几种不同的虚拟环境管理器,每种管理器都有略微不同的方式处理Python的安装位置和如何运行Python,具体可以参考这个答案。
本回答假设使用venv
模块,并且该模块已经按照文档进行了安装。
注意:一些Linux发行版将venv模块打包成一个单独的软件包:Ubuntu和Debian
如果在名为my_project
的文件夹内运行python -m venv my_project-venv
来安装虚拟环境,并将其安装在名为my_project-venv
的文件夹内,则该虚拟环境将位于该模块创建的新文件夹内:
my_project_dir
│
┝━ my_project-venv
在Windows上,使用Python 3.7.1版本时,my_project-venv
文件夹中的文件可能看起来像这样:
my_project-venv
│
┝━ Include
┝━ Lib
┝━ Scripts
│ ┝━ ...
│ ┝━ activate.bat
│ ┝━ Activate.ps1
│ ┝━ deactivate.bat
│ ┕━ ...
│
┕━ pyvenv.cfg
虚拟环境可以通过运行activate.bat
或Activate.ps1
脚本来启动,具体取决于使用的是cmd还是PowerShell:
:: Using cmd.exe
cd my_project_dir
.\my_project-venv\Scripts\activate.bat
# Using PowerShell
cd my_project_dir
.\my_project-venv\Scripts\Activate.ps1
注意:如果通过双击运行这些脚本,它们不会保持shell打开状态。请开启一个shell,然后输入上述命令来运行它们,将文件夹名称更改为您的项目所需的名称。
在大多数其他操作系统上,虚拟环境文件夹会像这样:
my_project-venv
│
┝━ bin
│ ┝━ ...
│ ┝━ activate
│ ┝━ activate.csh
│ ┝━ activate.fish
│ ┕━ ...
│
┝━ include
┝━ lib
┝━ lib64
┕━ pyvenv.cfg
然后,在除了 csh
或fish之外的任何shell中,通过以下方式激活环境:
# Most operating systems
cd my_project_dir
. my_project-venv/bin/activate
对于csh和fish,存在特定于shell的脚本用于激活虚拟环境(分别为activate.csh和activate.fish),可以像运行activate脚本一样运行它们。
一旦在所有操作系统上激活了虚拟环境,运行以下命令将启动IDLE并访问安装到虚拟环境中的软件包:
python -m idlelib.idle
对于Python 3.6+,请参阅下面Paul Wicking的答案。
在Python 3.6之前,IDLE本质上是
from idlelib.PyShell import main
if __name__ == '__main__':
main()
如果你使用的是默认虚拟环境,那么你可以自行启动它。
python -c "from idlelib.PyShell import main; main()"
,这样就可以避免将脚本保存在某个地方。 - Ronny Anderssonpython -m idlelib
- minopretPython 3.6 现代化和重构了idlelib
。这个变化包括了一些方法的重新命名。因此,必须使用idlelib.pyshell
来访问idlelib.PyShell
。下面的片段基于被接受的答案,并且适用于任何Python版本:
#!/usr/bin/env python
"""Simple script to run Idle from a venv in PyCharm."""
try:
# Import for Python pre 3.6
from idlelib.PyShell import main
except ModuleNotFoundError:
# Import for Python version 3.6 and later
from idlelib.pyshell import main
if __name__ == '__main__':
main()
some_script.py
可能会被其他Python解释器运行,而不是使用python some_script.py
命令时使用的那个(这取决于py
文件的关联)。如果想避免这个问题,最好创建一个批处理文件idle.bat
,内容为python -c "from idlelib.PyShell import main; main()"
,并将其放在虚拟环境中的Scripts
文件夹中。此外,正如其他人所指出的,idle需要tcl
和tk
文件夹才能工作。最简单的解决方法是创建符号链接从虚拟环境到base Python安装,如下所示。(2.7) c:\python\virtualenv\2.7\Lib>mklink /d tcl8.5 "c:\Program Files\Python\2.7\tcl\tcl8.5"
symbolic link created for tcl8.5 <<===>> c:\Program Files\Python\2.7\tcl\tcl8.5
(2.7) c:\python\virtualenv\2.7\Lib>mklink /d tk8.5 "c:\Program Files\Python\2.7\tcl\tk8.5"
symbolic link created for tk8.5 <<===>> c:\Program Files\Python\2.7\tcl\tk8.5
#Activate the virtualenv venv
source venv/bin/activate
#To Run IDLE in virtualenv venv
python -m idlelib
在运行IDLE后,您可以使用ctrl+o键盘快捷方式打开文件。
将一些答案整合起来,以下是在Windows上使用完全功能的批处理文件执行此操作的方法。
在您的虚拟环境的Scripts目录中创建idle.bat。它将在您的虚拟环境的Lib目录中创建(除非它们已经存在)到tcl和tk的链接(作者撰写时为8.5版本),然后启动idle。将此代码粘贴到编辑器中并确保路径名符合您当前虚拟环境和Python安装的要求(我的是标准的2.7),然后将其保存到Scripts/idle.bat。
IF EXIST C:\<path to current virtualenv>\Lib\tcl8.5 (
REM do nothing
) ELSE (
mklink /d C:\<path to current virtualenv>\Lib\tcl8.5 "c:\Python27\tcl\tcl8.5"
)
IF EXIST C:\<path to current virtualenv>\Lib\tk8.5 (
REM do nothing
) ELSE (
mklink /d C:\<path to current virtualenv>\Lib\tk8.5 "c:\Python27\tcl\tk8.5"
)
python -c "from idlelib.PyShell import main; main()"
使用PowerShell (以管理员身份运行!) 运行脚本以打开IDLE。
cd c:\<path to current virtualenv>\
./Scripts/idle.bat
@biomed 我在使用Windows系统,尝试了这个方法。在我的 python2.6 文件夹中,我需要将 python26/tcl/tcl8.5 和 python/tcl/tk8.5 文件夹复制到 python26/Lib 中,然后在我的虚拟环境的脚本文件夹中创建了上面的脚本。效果很好。
On Windows:
C:\foo\bar\{venv_name}\activate
python -m idlelib
对于我来说,像这样启动东西就可以了(Linux终端):
source venv/bin/activate && python `which idle` &
alias idle='python -m idlelib.idle'
将其设置为别名。您也可以通过设置DOSKEY在Windows上执行此操作:https://dev59.com/-2Ij5IYBdhLWcg3wMiYu#21040825 - Maximpython3 -m idlelib.idle
命令来启动IDLE。 - undefined.idle
?我只需要简单地运行python -m idlelib
就可以开始使用了。 - undefined