Làm cách nào tôi có thể sử dụng tập lệnh Python trong dòng lệnh mà không cần cd-ing vào thư mục của nó? Có phải là PYTHONPATH?


157

Làm cách nào tôi có thể sử dụng PYTHONPATH? Khi tôi cố chạy tập lệnh trong đường dẫn, tập tin không được tìm thấy. Khi tôi cd vào thư mục giữ tập lệnh, tập lệnh sẽ chạy. Vì vậy, những gì tốt là PYTHONPATH?

$ echo $PYTHONPATH
:/home/randy/lib/python

$ tree -L 1 '/home/randy/lib/python' 
/home/randy/lib/python
├── gbmx_html.py
├── gbmx.py
├── __init__.py
├── __pycache__
├── scripts
└── yesno.py

$ python gbmx.py -h
python: can't open file 'gbmx.py': [Errno 2] No such file or directory

$ cd '/home/randy/lib/python'

Sau khi cd vào thư mục tập tin, nó chạy ..

$ python gbmx.py -h
usage: gbmx.py [-h] [-b]

Tại sao tôi không thể sử dụng PYTHONPATH?


1
Chúng ta có thể thay đổi tiêu đề của bài viết này? Nó không thực sự yêu cầu một lời giải thích PYTHONPATH.
Nico Cernek

Tiêu đề được chỉnh sửa bởi vì đây là điều đầu tiên xuất hiện khi googlingPYTHONPATH
raphael

Câu trả lời:


194

Tôi nghĩ bạn hơi bối rối. PYTHONPATH đặt đường dẫn tìm kiếm để nhập các mô-đun python, không phải để thực thi chúng như bạn đang thử.

PYTHONPATH Tăng cường đường dẫn tìm kiếm mặc định cho các tệp mô-đun. Định dạng này giống như PATH của shell: một hoặc nhiều tên đường dẫn thư mục được phân tách bằng os.pathsep (ví dụ: dấu hai chấm trên Unix hoặc dấu chấm phẩy trên Windows). Thư mục không tồn tại được âm thầm bỏ qua.

Ngoài các thư mục thông thường, các mục nhập PYTHONPATH riêng lẻ có thể đề cập đến các tệp zip chứa các mô-đun Python thuần túy (ở dạng nguồn hoặc dạng được biên dịch). Các mô-đun mở rộng không thể được nhập từ zipfiles.

Đường dẫn tìm kiếm mặc định phụ thuộc vào cài đặt, nhưng thường bắt đầu bằng tiền tố / lib / pythonversion (xem PYTHONHOME ở trên). Nó luôn được gắn vào PYTHONPATH.

Một thư mục bổ sung sẽ được chèn vào đường dẫn tìm kiếm phía trước PYTHONPATH như được mô tả ở trên trong Tùy chọn giao diện. Đường dẫn tìm kiếm có thể được thao tác từ bên trong chương trình Python dưới dạng biến sys.path.

http://docs.python.org/2/USE/cmdline.html#envvar-PYTHONPATH

Những gì bạn đang tìm kiếm là PATH.

export PATH=$PATH:/home/randy/lib/python 

Tuy nhiên, để chạy tập lệnh python của bạn dưới dạng chương trình, bạn cũng cần đặt shebang cho Python ở dòng đầu tiên. Một cái gì đó như thế này sẽ hoạt động:

#!/usr/bin/env python

Và cung cấp đặc quyền thực thi cho nó:

chmod +x /home/randy/lib/python/gbmx.py

Sau đó, bạn sẽ có thể chỉ cần chạy gmbx.pytừ bất cứ đâu.


2
Cảm ơn bạn. Tôi vẫn là ủi này ra. Kịch bản của tôi không thành công trong việc nhập các mô-đun từ PYTHONPATH tùy chỉnh của tôi. Và bây giờ tôi hiểu sự khác biệt: tất cả là về kịch bản so với mô-đun; lệnh script so với nhập python. Có, trên thực tế tôi sẽ sử dụngexport PATH=$PATH:/home/etc
Randy Skretka

57

Bạn đang nhầm lẫn PATH và PYTHONPATH. Bạn cần phải làm điều này:

export PATH=$PATH:/home/randy/lib/python 

PYTHONPATH được trình thông dịch python sử dụng để xác định mô-đun nào sẽ tải.

PATH được sử dụng bởi shell để xác định thực thi nào sẽ chạy.


38

PYTHONPATHchỉ ảnh hưởng đến các importcâu lệnh, chứ không phải tra cứu các tệp python của trình thông dịch cấp cao nhất được đưa ra làm đối số.

Cần PYTHONPATHphải được thiết lập không phải là một ý tưởng tuyệt vời - vì với bất kỳ điều gì phụ thuộc vào các biến môi trường, việc sao chép mọi thứ một cách nhất quán trên các máy khác nhau trở nên khó khăn. Tốt hơn là sử dụng 'gói' Python có thể được cài đặt (sử dụng 'pip' hoặc distutils) trong các đường dẫn phụ thuộc hệ thống mà Python đã biết.

Hãy đọc https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/ - 'Hướng dẫn về cách đóng gói của Hitchhiker's', và http://docs.python.org/3/tutorial /modules.html - giải thích PYTHONPATH và các gói ở mức thấp hơn.


Điểm lấy. Trong trường hợp cụ thể này, việc thêm vào PYTHONPATH dường như hoạt động tốt. Là một người dùng trên một máy, tôi cũng có thể sử dụng và sử dụng lại một số mã .py đã được viết.
Randy Skretka

1
Tôi thực sự không nghĩ rằng cài đặt mọi thứ trong các đường dẫn phụ thuộc hệ thống, với quyền truy cập root được yêu cầu, là một ý tưởng tốt hơn so với sử dụng PYTHONPATH. Tôi không đếm thêm bao nhiêu lần tôi đã phải đối phó với một chương trình Python thô sơ khăng khăng đòi pip installtôi là người dùng thường xuyên trên máy chủ không chỉ không có quyền truy cập root (tôi biết pip có thể cài đặt cục bộ) nhưng cũng không có pip. Dưới đây là lời khuyên cho mọi người phân phối phần mềm Python - trước tiên hãy thử cài đặt phần mềm của riêng bạn trên máy chủ vanilla Linux nơi bạn không có quyền truy cập root và chỉ phân phối Python lõi mà không có pip, trước tiên.
Amn

3

Tôi nghĩ rằng bạn đang trộn lẫn giữa PATH và PYTHONPATH. Tất cả những gì bạn phải làm để chạy một 'tập lệnh' là thư mục của phụ huynh được thêm vào biến PATH của bạn. Bạn có thể kiểm tra điều này bằng cách chạy

which myscript.py

Ngoài ra, nếu myscripy.pyphụ thuộc vào các mô-đun tùy chỉnh, các thư mục gốc của chúng cũng phải được thêm vào biến PYTHONPATH. Thật không may, vì các nhà thiết kế của python rõ ràng là về ma túy, việc kiểm tra nhập khẩu của bạn bằng cách thay thế sau đây sẽ không đảm bảo rằng PYTHONPATH của bạn được đặt đúng để sử dụng trong tập lệnh. Phần lập trình python này là ma thuật và không thể được trả lời một cách thích hợp trên stackoverflow.

$python
Python 2.7.8 blahblahblah
...
>from mymodule.submodule import ClassName
>test = ClassName()
>^D
$myscript_that_needs_mymodule.submodule.py
Traceback (most recent call last):
  File "myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
  File "/path/to/myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
ImportError: No module named submodule

3

Với PYTHONPATH được đặt như trong ví dụ của bạn, bạn sẽ có thể làm

python -m gmbx

-mtùy chọn sẽ làm cho Python tìm kiếm mô-đun của bạn trong các đường dẫn Python thường tìm kiếm các mô-đun, bao gồm cả những gì bạn đã thêm vào PYTHONPATH. Khi bạn chạy trình thông dịch như thế python gmbx.py, nó sẽ tìm tệp cụ thể và PYTHONPATH không áp dụng.

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.