2011-07-21 46 views
36

Vì vậy, tôi đã thực hiện một chút công bằng của tập lệnh bash, nhưng rất ít tập lệnh theo lô trên Windows. Tôi đang cố gắng để kích hoạt một virtualenv python, chạy một kịch bản python, sau đó tắt virtualenv khi kịch bản thoát.lô tương đương với "nguồn" trên cửa sổ: cách chạy tập lệnh python từ virtualenv

Tôi đã có một thư mục có tên env, đó là virtualenv của tôi, và một thư mục có tên công việc, trong đó có chứa các kịch bản của tôi

Đây là những gì tôi đã có cho đến nay:

%~dp0env\Scripts\activate.bat 
python %~dp0work\script.py 
deactivate 

Tuy nhiên , khi tôi chạy tập lệnh, nó kích hoạt virtualenv rồi dừng lại. Nó không đến dòng thứ hai và chạy tập lệnh Python. Có cách nào để "nguồn" thư mục kịch bản kích hoạt, để phần còn lại của kịch bản lô có thể được chạy như thể tôi gọi là activate.bat từ dòng lệnh?

Trả lời

55

Tôi muốn nói bạn chỉ cần thêm vào trước 'gọi' để gọi activate.bat của bạn, để đảm bảo rằng các tập tin thực thi hiện nay được mở lại sau kích hoạt được thực hiện:

call %~dp0env\Scripts\activate.bat 

Cân nhắc làm tương tự cho Tắt .gậy . Hơn nữa, nếu bạn muốn đảm bảo rằng môi trường cmd.exe hiện tại không bị ô nhiễm bởi một cuộc gọi đến tệp lô của bạn, hãy xem xét gói các lệnh của bạn trong một cặp lệnh setlocal/endlocal.

+0

Tôi sẽ thử điều này, nhưng điều này có vẻ giống như những gì tôi muốn. Cảm ơn! – jmite

+0

@Nicola Nếu batch1.bat chứa 'batch2.bat' và' echo 1', và batch2.bat chứa 'echo 2', và tôi chạy batch1.bat, tôi thấy một shell mới mở, sau đó' 2', sau đó ' 1', vì vậy tôi không nghĩ rằng đây là vấn đề. – agf

+0

Từ tài liệu lệnh "Gọi": "Gọi một chương trình lô từ chương trình khác mà không dừng chương trình hàng loạt gốc". (http://technet.microsoft.com/en-us/library/cc732835%28WS.10%29.aspx) –

2

Tôi cho rằng chỉ muốn perfrom các lệnh tương tự trong các cửa sổ như thể mong đợi trong linux bash/vỏ. Khi tôi muốn bắt đầu một virtualenv I'am thực sự trong thư mục trên cùng của nó, lệnh linux sẽ là "bin nguồn/kích hoạt". Không có vấn đề gì khi mô phỏng hành vi này trong các cửa sổ. Cá nhân tôi, tôi đã đặt tên tệp batch là activate.bat ở đâu đó trên PATH như sau:

:: activate.bat 
@echo off 
REM source bin/activate 
if "%1" == "bin/activate" (
    if not EXIST "%CD%\Scripts\activate.bat" goto notfound 
    set WRAPEX=Scripts\activate.bat 
) ELSE (
    set WRAPEX=%* 
) 
call %WRAPEX% 
goto :eof 

:notfound 
echo Cannot find the activate script -- aborting. 
goto :eof 
Các vấn đề liên quan