如何从虚拟环境(virtualenv)启动Python Idle

74

我安装了一个包在虚拟环境里。如果我只启动Python解释器,那个包可以被成功导入。但是,如果我启动Idle,那个包无法被导入(因为它只存在于某一个特定的虚拟环境中而不是全局)。如何从虚拟环境中启动Idle,以便所有来自虚拟环境的包都可用?

9个回答

108

简短回答

  1. 启动虚拟环境
  2. 运行python -m idlelib.idle

摘自这个答案

详细回答

本回答假设使用Python 3。

有几种不同的虚拟环境管理器,每种管理器都有略微不同的方式处理Python的安装位置和如何运行Python,具体可以参考这个答案

本回答假设使用venv模块,并且该模块已经按照文档进行了安装。

注意:一些Linux发行版将venv模块打包成一个单独的软件包:UbuntuDebian

如果在名为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.batActivate.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

然后,在除了 cshfish之外的任何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

3
专业提示:使用alias idle='python -m idlelib.idle'将其设置为别名。您也可以通过设置DOSKEY在Windows上执行此操作:https://dev59.com/-2Ij5IYBdhLWcg3wMiYu#21040825 - Maxim
对于大多数Linux发行版来说,可以使用python3 -m idlelib.idle命令来启动IDLE。 - undefined
为什么最后要加上.idle?我只需要简单地运行python -m idlelib就可以开始使用了。 - undefined

42

对于Python 3.6+,请参阅下面Paul Wicking的答案

在Python 3.6之前,IDLE本质上是

from idlelib.PyShell import main
if __name__ == '__main__':
  main()

如果你使用的是默认虚拟环境,那么你可以自行启动它。


1
我应该从哪个文件夹运行这些脚本?谢谢。 - Kevin Le - Khnle
@biomed:看看你的虚拟环境的lib目录。找到其中任何一个.pth文件;很容易看出它的工作原理。名称是可导入的名称,内容是路径。试试用Tkinter做这样的事情。(不,我没有尝试过用Tkinter。) - 9000
7
在一个激活的virtualenv中,您只需键入 python -c "from idlelib.PyShell import main; main()",这样就可以避免将脚本保存在某个地方。 - Ronny Andersson
17
好的,我会尽力进行翻译并保留原意。以下是需要翻译的内容:indeed, python -m idlelib - minopret
1
请查看Paul Wicking的下面的答案,其中包含一个适用于Python 3.6之前和之后版本的脚本。这个对我很有用。 - luv2learn
显示剩余5条评论

10

Python 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()

9
在Windows上,像这样从命令行运行Python脚本some_script.py可能会被其他Python解释器运行,而不是使用python some_script.py命令时使用的那个(这取决于py文件的关联)。如果想避免这个问题,最好创建一个批处理文件idle.bat,内容为python -c "from idlelib.PyShell import main; main()",并将其放在虚拟环境中的Scripts文件夹中。此外,正如其他人所指出的,idle需要tcltk文件夹才能工作。最简单的解决方法是创建符号链接从虚拟环境到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

+1,感谢您的回复。只是想提醒一下:不要将Python安装在Program Files目录下,因为路径名中有空格!Virtualenv对我来说一直失败,重新在C:\(默认)下安装Python解决了这个问题。 - Sabuncu
即使在创建符号文件夹链接后,我也无法在Python 2.7系统中使idle.bat文件正常工作。我最初将它们创建在Lib下,但是idle.bat启动失败了。然后我在虚拟环境下创建了一个名为tcl的文件夹,并在那里创建了符号文件夹链接,但仍然产生了错误:“Traceback(最近的调用):”… _tkinter.TclError:在以下目录中找不到可用的init.tcl:{C:\Users\AMS\my_env\tcl\tcl8.5} C:/Python27/lib/tcl8.5 C:/Users/AMS/my_env/lib/tcl8.5…这可能意味着Tcl未正确安装。”有什么想法吗? - Sabuncu
好的,按照Tim在下面指出的方法复制这两个文件夹(而不是使用符号链接)解决了问题,现在我可以通过idle.bat启动IDLE。 - Sabuncu

6
我正在使用操作系统Ubuntu 15.04。我已经使用virtualenv安装了一些软件包。 因此,为了运行虚拟环境中的文件(包括这些软件包),我在终端中使用以下命令: (我的虚拟环境名称为venv):
#Activate the virtualenv venv
source venv/bin/activate

#To Run IDLE in virtualenv venv
python -m idlelib

在运行IDLE后,您可以使用ctrl+o键盘快捷方式打开文件。


3

将一些答案整合起来,以下是在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

谢谢!我正在寻找一份与我之前在不同机器上制作的脚本完全相同的脚本。 - Kashyap Nadig

2

@biomed 我在使用Windows系统,尝试了这个方法。在我的 python2.6 文件夹中,我需要将 python26/tcl/tcl8.5 和 python/tcl/tk8.5 文件夹复制到 python26/Lib 中,然后在我的虚拟环境的脚本文件夹中创建了上面的脚本。效果很好。


2

On Windows:

C:\foo\bar\{venv_name}\activate
python -m idlelib

1

对于我来说,像这样启动东西就可以了(Linux终端):

source venv/bin/activate && python `which idle` &

(venv是指您的虚拟环境路径)


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