I have a package that I installed from a virtual environment. If I just launch the python interpreter, that package can be imported just fine. However, if I launch Idle, that package cannot be imported (since it’s only available in one particular virtualenv and not global). How can I launch Idle from a virtualenv, so that all packages from the virtualenv would be available?
For Python 3.6+, please see Paul Wicking’s answer below.
In Python prior to 3.6, IDLE is essentially
from idlelib.PyShell import main if __name__ == '__main__': main()
So you can launch it yourself unless you built the virtualenv without default packages.
- Start the virtual environment
python -m idlelib.idle
From this answer.
This answer assumes Python 3.
There are a few different virtual environment managers, each of which has a slightly different way of handling where python is installed and how it’s run, as detailed in this answer.
If the virtual environment was installed in a folder called
my_project-venv by running
python -m venv my_project-venv from inside the folder
my_project, the virtual environment will be inside a new folder created by the module:
my_project_dir ? ?? my_project-venv
On Windows, with Python 3.7.1, the files inside the
my_project-venv folder will probably look like this:
my_project-venv ? ?? Include ?? Lib ?? Scripts ? ?? ... ? ?? activate.bat ? ?? Activate.ps1 ? ?? deactivate.bat ? ?? ... ? ?? pyvenv.cfg
The virtual environment can be started by running either the
Activate.ps1 script, depending on whether
cmd or PowerShell is used:
:: Using cmd.exe cd my_project_dir .my_project-venvScriptsactivate.bat
# Using PowerShell cd my_project_dir .my_project-venvScriptsActivate.ps1
Note: These scripts don’t keep the shell open if run by double-clicking them. Start a shell, then run them by typing the above commands, with the folder names changed for your project
On most other operating systems, the virtual environment folder will look like this:
my_project-venv ? ?? bin ? ?? ... ? ?? activate ? ?? activate.csh ? ?? activate.fish ? ?? ... ? ?? include ?? lib ?? lib64 ?? pyvenv.cfg
Then, from any shell other than
csh or fish, activate the environment by:
# Most operating systems cd my_project_dir . my_project-venv/bin/activate
fish there are shell-specific scripts for activating the virtual environment (
activate.fish, respectively) and they can be run like the
Once the virtual environment has been activated on all operating systems, running the following will start IDLE with access to the packages installed into the virtual environment:
python -m idlelib.idle
On Windows, a Python script run from command line like this
some_script.py might be run by other Python interpreter than the one used when using
python some_script.py command (it depends on
py files association). If one wants to avoid this problem it’s best to create a batch file
idle.bat with the content
python -c "from idlelib.PyShell import main; main()" and place it in the
Scripts folder in the virtualenv. Also, like others noted idle needs both
tk folders to work. The simplest solution is to create symbolic links from virtualenv to the base Python installation like this
(2.7) c:pythonvirtualenv2.7Lib>mklink /d tcl8.5 "c:Program FilesPython2.7tcltcl8.5" symbolic link created for tcl8.5 <<===>> c:Program FilesPython2.7tcltcl8.5 (2.7) c:pythonvirtualenv2.7Lib>mklink /d tk8.5 "c:Program FilesPython2.7tcltk8.5" symbolic link created for tk8.5 <<===>> c:Program FilesPython2.7tcltk8.5
Python 3.6 modernized and refactored
idlelib. This change included the renaming of several methods. Because of this,
idlelib.PyShell must now be accessed with
idlelib.pyshell. The following snippet is based on the accepted answer and should work for any Python version:
#!/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()
I am using Ubuntu 15.04 operating system. I have installed some packages using virtualenv.
So, to run the files inside virtualenv including those packages I use the following commands in terminal
(Name of my virtual environment is venv):
#Activate the virtualenv venv source venv/bin/activate #To Run IDLE in virtualenv venv python -m idlelib
After running the IDLE, you can open file using ctrl+o keyboard shortcut.
Putting a few answers together and here is how I do this on Window with a fully functional batch file.
Make idle.bat in your virtualenv’s Scripts directory. It will create (unless they exist) both links to tcl and tk (version 8.5 as of writing) and put them in you virtualenv’s Lib directory then it fires up idle. Copy and paste this code exactly into an editor. Change the path names for your current virtualenv and Python install (mine is the standard for 2.7) then save it into Scripts/idle.bat.
IF EXIST C:<path to current virtualenv>Libtcl8.5 ( REM do nothing ) ELSE ( mklink /d C:<path to current virtualenv>Libtcl8.5 "c:Python27tcltcl8.5" ) IF EXIST C:<path to current virtualenv>Libtk8.5 ( REM do nothing ) ELSE ( mklink /d C:<path to current virtualenv>Libtk8.5 "c:Python27tcltk8.5" ) python -c "from idlelib.PyShell import main; main()"
Run the script with Powershell (RUN AS ADMIN!) to open idle.
cd c:<path to current virtualenv> ./Scripts/idle.bat
@biomed I am on Windows and I was trying this. In my python2.6 folder I had to copy the python26/tcl/tcl8.5 and python/tcl/tk8.5 folders to python26/Lib and then I created the script above in my virtualenv’s scripts folder. Worked great.
For me launching something like this just works (Linux terminal):
source venv/bin/activate && python `which idle` &
(venv is path to your venv obviously)