Python - thêm PYTHONPATH trong khi chạy mô-đun dòng lệnh


86

Tôi muốn chạy:

python somescript.py somecommand

Tuy nhiên, khi tôi chạy nó, tôi cần PYTHONPATHphải bao gồm một thư mục nhất định. Tôi không thể chỉ thêm nó vào các biến môi trường của mình vì thư mục tôi muốn thêm các thay đổi dựa trên dự án tôi đang chạy. Có cách nào để thay đổi PYTHONPATHtrong khi chạy tập lệnh không? Lưu ý: Tôi thậm chí không có một PYTHONPATHbiến, vì vậy tôi không cần phải lo lắng về việc thêm vào nó và ghi đè nó trong khi chạy tập lệnh này.

Câu trả lời:


148

Đối với Mac / Linux;

PYTHONPATH=/foo/bar/baz python somescript.py somecommand

Đối với Windows, thiết lập trình bao bọc pythonpath.bat;

@ECHO OFF
setlocal
set PYTHONPATH=%1
python %2 %3
endlocal

và gọi pythonpath.battập tin script như;

pythonpath.bat /foo/bar/baz somescript.py somecommand

@ İsmail - cảm ơn. Tuy nhiên, làm cách nào tôi có thể làm điều đó trong khi chạy một tập lệnh từ dấu nhắc lệnh của mình? Tôi không chạy Python, nhập nội dung và chạy nó theo cách thủ công.
orokusaki

Trên Mac / Linux, bạn sẽ làm đượcPYTHONPATH=/foo/bar python somescript.py somecommand
ismail

Tôi đã thử python -c"import sys;sys.path.append('/my/dir')"và sau đó python myscript.py mycommand, nhưng rõ ràng là nó không chia sẻ đường dẫn từ phiên thông dịch đầu tiên với phiên tiếp theo. À, vừa thấy nhận xét tiếp theo của bạn, đang thử ngay bây giờ ... Không hoạt động trên WinXP.
orokusaki

1
Không có unsetlệnh biến môi trường trên Windows. Thay vào đó, hãy thêm dấu setlocalsau phần đầu echo offvà sau đó một ẩn endlocalsẽ xảy ra khi tập lệnh .bat kết thúc (và PYTHONPATHsẽ được khôi phục về giá trị trước đó của nó).
martineau

5
Trên Windows, nếu bạn muốn nối một đường dẫn hiện có PYTHONPATH, bạn có thể muốn sử dụng set PYTHONPATH=%PYTHONPATH%;%1.
martineau

49
 import sys
 sys.path.append('your certain directory')

Về cơ bản sys.path là một danh sách với tất cả các đường dẫn tìm kiếm cho mô-đun python. Nó được khởi tạo bởi trình thông dịch. Nội dung của PYTHONPATH được tự động thêm vào cuối danh sách đó.


10
hoặc sys.path.insert (0, '/ some / directory') để đặt nó ở đầu đường dẫn của bạn. Điều này cho phép tài liệu của bạn ghi đè những thứ khác có thể đã có trên pythonpath.
sienkiew

Tôi đã sử dụng câu trả lời này để chạy không kiểm tra bên ngoài IDE pydev-eclipse.
LAL

sys.path.append(r'D:\PyCharmProjects\cheese_shoppe')ví dụ trong Windows.
Bob Stein

9

Nếu bạn đang chạy lệnh từ một trình bao tương thích với POSIX, chẳng hạn như bash, bạn có thể đặt biến môi trường như sau:

PYTHONPATH="/path/to" python somescript.py somecommand

Nếu tất cả trên một dòng, giá trị môi trường PYTHONPATH chỉ áp dụng cho một lệnh đó.

$ echo $PYTHONPATH

$ python -c 'import sys;print("/tmp/pydir" in sys.path)'
False
$ PYTHONPATH=/tmp/pydir python -c 'import sys;print("/tmp/pydir" in sys.path)'
True
$ echo $PYTHONPATH

Chỉ là những gì tôi đang tìm kiếm, cảm ơn rất nhiều. Vì một số lý do chạy python -c "import sys; sys.path.insert(0,'my/path'); import mymodule"không hoạt động.
Luke Davis

0

Bạn có thể thử điều này để thực thi một hàm bên trong tập lệnh của mình

python -c "import sys; sys.path.append('/your/script/path'); import yourscript; yourscript.yourfunction()"

-1

Điều này dành cho các cửa sổ:

Ví dụ, tôi có một thư mục có tên "mygrapher" trên màn hình của mình. Bên trong, có các thư mục được gọi là "tính toán" và "vẽ đồ thị" chứa các tệp Python mà tệp chính của tôi "grapherMain.py" cần. Ngoài ra, "grapherMain.py" được lưu trữ trong "vẽ đồ thị". Để chạy mọi thứ mà không cần di chuyển tệp, tôi có thể tạo tập lệnh hàng loạt. Hãy gọi tệp hàng loạt này là "rungraph.bat".

@ECHO OFF
setlocal
set PYTHONPATH=%cd%\grapher;%cd%\calculation
python %cd%\grapher\grapherMain.py
endlocal

Tập lệnh này nằm trong "mygrapher". Để chạy mọi thứ, tôi sẽ vào dấu nhắc lệnh của mình, sau đó thực hiện:

>cd Desktop\mygrapher (this navigates into the "mygrapher" folder)
>rungraph.bat (this executes the batch file)

5
và câu trả lời này khác với câu trả lời của @ İsmail 'cartman' Dönmez như thế nào?
Alex Okrushko,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.