2011-02-07 34 views
27

Tôi có một gói mà tôi đã cài đặt từ một môi trường ảo. Nếu tôi chỉ khởi chạy trình thông dịch python, gói đó có thể được nhập tốt. Tuy nhiên, nếu tôi khởi chạy Idle, gói đó không thể được nhập (vì nó chỉ có sẵn trong một virtualenv cụ thể và không phải là toàn cục). Làm thế nào tôi có thể khởi chạy Idle từ virtualenv, sao cho tất cả các gói từ virtualenv sẽ có sẵn?Làm thế nào để khởi động python Idle từ một môi trường ảo (virtualenv)

Trả lời

33

IDLE về bản chất là

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

Vì vậy, bạn có thể khởi động nó cho mình, trừ khi bạn đã xây dựng virtualenv mà không cần gói mặc định.

+1

Từ thư mục nào tôi sẽ chạy tập lệnh đó? Cảm ơn –

+0

@Khnle: từ thư mục chứa dự án của bạn, một cách rõ ràng, sau khi bạn đã kích hoạt virtualenv. Tôi chỉ thử nó, và nó hoạt động. Đặt kịch bản này vào 'bin' của virtualenv của bạn. – 9000

+0

Tôi tạo ra một kịch bản nhàn rỗi trong bin/của virtualenv của tôi và tôi sử dụng python virtualenv trong shebang của tôi nhưng nó phàn nàn về việc không thể tìm thấy Tkinter. Tôi đã kiểm tra và Tkinter có thể được nhập khẩu trong python2.7.1 thông thường nhưng tôi không thể nhập Tkinter từ virtualenv python của tôi. Làm thế nào tôi có thể làm cho Tkinter sẵn sàng cho mython virtualenv của tôi (tôi không sử dụng gói trang web nào vì một lý do khác) – biomed

2

@biomed Tôi đang sử dụng Windows và tôi đã thử cách này. Trong thư mục python2.6 của tôi, tôi đã phải sao chép các thư mục python26/tcl/tcl8.5 và python/tcl/tk8.5 vào python26/Lib và sau đó tôi đã tạo kịch bản ở trên trong thư mục tập lệnh ảo của tôi. Làm việc tuyệt vời.

+0

+1, cảm ơn bạn vì điều này. – Sabuncu

9

Trên Windows, một tập lệnh Python chạy từ dòng lệnh như thế này some_script.py có thể được chạy bởi trình thông dịch Python khác so với lệnh được sử dụng khi sử dụng lệnh python some_script.py (tùy thuộc vào liên kết tệp py). Nếu bạn muốn tránh vấn đề này, tốt nhất bạn nên tạo một tệp hàng loạt idle.bat với nội dung python -c "from idlelib.PyShell import main; main()" và đặt nó trong thư mục Scripts trong virtualenv. Ngoài ra, giống như những người khác ghi chú không hoạt động cần cả hai thư mục tcltk để hoạt động. Giải pháp đơn giản nhất là tạo liên kết tượng trưng từ virtualenv đến cơ sở lắp đặt Python như thế này

(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 
+0

+1, cảm ơn bạn vì điều này. Chỉ cần lưu ý: KHÔNG cài đặt Python trong Program Files vì ​​không gian trong tên đường dẫn! Virtualenv đã thất bại đối với tôi, và cài đặt lại Python trong C: \ (mặc định) đã sửa nó. – Sabuncu

+0

Tôi không thể lấy tệp idle.bat để làm việc trên hệ thống Python 2.7 của tôi, ngay cả sau khi tạo liên kết thư mục tượng trưng. Ban đầu tôi tạo ra chúng dưới Lib, và idle.bat khởi động thất bại. Sau đó, tôi tạo một thư mục có tên tcl dưới môi trường ảo và tạo ra các liên kết thư mục tượng trưng ở đó, và nó vẫn tạo ra một lỗi: Traceback (cuộc gọi gần đây nhất): "... _tkinter.TclError: Không thể tìm thấy một init có thể sử dụng được .tcl trong các thư mục sau: {C: \ Users \ AMS \ my_env \ tcl \ tcl8.5} C: /Python27/lib/tcl8.5 C: /Users/AMS/my_env/lib/tcl8.5 ... Điều này có thể có nghĩa là Tcl không được cài đặt đúng cách. " Bất kỳ ý tưởng? – Sabuncu

+0

OK, sao chép hai thư mục như Tim đã chỉ ra bên dưới (thay vì liên kết tượng trưng) đã khắc phục sự cố và tôi có thể khởi chạy IDLE qua idle.bat. – Sabuncu

3

Đưa một vài câu trả lời với nhau và đây là cách tôi làm điều này trên cửa sổ với một tập tin thực thi đầy đủ chức năng.

Đặt idle.bat trong thư mục Scripts ảo của bạn. Nó sẽ tạo (trừ khi chúng tồn tại) cả hai liên kết tới tcl và tk (phiên bản 8.5 bằng văn bản) và đặt chúng vào thư mục lib của virtualenv của bạn sau đó nó sẽ không hoạt động. Sao chép và dán mã này chính xác vào trình chỉnh sửa. Thay đổi tên đường dẫn cho cài đặt virtualenv và Python hiện tại của bạn (tôi là tiêu chuẩn cho 2.7), sau đó lưu nó vào 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()" 

Chạy tập lệnh bằng Powershell (RUN AS ADMIN!) Để mở chế độ chờ.

cd c:\<path to current virtualenv>\ 
./Scripts/idle.bat 
+0

Cảm ơn! Tôi đã tìm kiếm một kịch bản chính xác như thế này mà tôi đã thực hiện trước đó trên một máy khác. –

0

Đối với tôi tung ra một cái gì đó giống như chỉ hoạt động (Linux terminal) này:

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

(venv là đường dẫn đến venv của bạn rõ ràng)

21

tôi chạy kịch bản .\(virtualenv dir)\Scripts\activate.bat từ dòng lệnh, sau đó làm:

python -m idlelib.idle 

Từ this answer.

+1

Cảm ơn - công trình này hoàn hảo trên các cửa sổ. – Simon

+1

nó cũng hoạt động trên Mac. –

1

Tôi đang sử dụng Ubuntu 15.04 hệ điều hành. Tôi đã cài đặt một số gói bằng cách sử dụng virtualenv.

Vì vậy, để chạy các tập tin bên trong virtualenv kể cả những gói tôi sử dụng các lệnh sau trong terminal

(Tên của môi trường ảo của tôi là venv):

#Activate the virtualenv venv 
source venv/bin/activate 

#To Run IDLE in virtualenv venv 
python -m idlelib 

Sau khi chạy IDLE, bạn có thể mở tệp bằng cách sử dụng phím tắt ctrl + o phím tắt.

0

Python 3.6 modernized and refactoredidlelib. Thay đổi này bao gồm việc đổi tên một số phương thức. Do đó, idlelib.PyShell hiện phải được truy cập với idlelib.pyshell. Đoạn mã sau dựa trên câu trả lời được chấp nhận và sẽ hoạt động với bất kỳ phiên bản Python nào:

#!/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() 
Các vấn đề liên quan