Vĩnh viễn thêm một thư mục vào PYTHONPATH?


324

Bất cứ khi nào tôi sử dụng sys.path.append, thư mục mới sẽ được thêm vào. Tuy nhiên, một khi tôi đóng python, danh sách sẽ trở lại các giá trị (mặc định?) Trước đó. Làm thế nào để tôi vĩnh viễn thêm một thư mục vào PYTHONPATH?

Câu trả lời:


135

Bạn cần thêm thư mục mới của mình vào biến môi trường PYTHONPATH, được phân tách bằng dấu hai chấm từ nội dung trước đó. Trong bất kỳ dạng Unix nào, bạn có thể thực hiện điều đó trong tập lệnh khởi động phù hợp với bất kỳ shell nào bạn đang sử dụng ( .profilehoặc bất cứ thứ gì, tùy thuộc vào shell yêu thích của bạn) với một lệnh, một lần nữa, tùy thuộc vào shell được đề cập; trong Windows, bạn có thể làm điều đó thông qua GUI hệ thống cho mục đích này.

superuser.com có thể là một nơi tốt hơn để hỏi thêm, tức là để biết thêm chi tiết nếu bạn cần chi tiết cụ thể về cách làm phong phú một biến môi trường trong nền tảng và vỏ được chọn của bạn, vì đó không thực sự là một câu hỏi lập trình.


8
Errata: dấu phân cách trên cửa sổ sẽ là dấu chấm phẩy. Nếu bạn cần ghi đè đường dẫn hệ thống trên windows, cài đặt qua GUI làm biến môi trường người dùng có thể không đủ, vì các biến người dùng được gắn vào biến hệ thống. Trong những trường hợp này, bạn sẽ cần phải sử dụng tập lệnh khởi động để thực hiện các điều chỉnh cần thiết.
Nathan Ernst

1
@Nathan, tx cho lời nhắc về dấu chấm phẩy, nhưng (nếu bạn là quản trị viên tất nhiên), bạn có thể đặt hệ thống env.vars trên windows (cộng với, OP không hỏi cách ghi đè đường dẫn, chỉ là cách thêm vào nó , vì vậy, một người dùng env.var cũng sẽ ổn vì điều đó! -).
Alex Martelli

Thật không may, tôi không phải là quản trị viên trên PC làm việc của mình, vì vậy tôi phải sử dụng các biện pháp như vậy. :(
Nathan Ernst

439

Nếu bạn đang sử dụng bash (trên bản phân phối Mac hoặc GNU / Linux), hãy thêm phần này vào ~/.bashrc

export PYTHONPATH="${PYTHONPATH}:/my/other/path"

28
Điều này hoạt động hoàn hảo với tôi, nhưng hãy đảm bảo thư mục bạn trỏ đến có ở tệp init .py trên cùng trong cấu trúc thư mục của bạn. Điều này ban đầu không hoàn toàn rõ ràng đối với tôi. Ví dụ: tôi đã thử xuất PYTHONPATH = $ PYTHONPATH: / Users / joey / repos nhưng nó không hoạt động vì thư mục repos của tôi không có _ init_ .py. Đi xuống một thư mục xa hơn: / Users / joey / repos / Cụ thểRepo đã thực hiện thủ thuật này. Bây giờ python có thể duyệt qua bất kỳ thư mục hướng xuống nào được kết nối với thư mục cụ thểRepo có chứa init .py!
Qiao Yi

3
cái này hiệu quả với tôi nhưng bạn có thể giải thích biến PYTHONPATH này nằm ở đâu không? và làm thế nào để "xuất PYTHONPATH" biết để xác định vị trí tệp chính xác đó?
appleLover

42
nhớ sau khi bạn chỉnh sửa, ~/.bashrcsau đó chạy source ~/.bashrcxem stackoverflow.com/questions/2518127/
Khăn

2
Tôi nghĩ rằng đó là một ý tưởng tồi khi đặt sudo suvào đầu tệp .bashrc của bạn. Bài đăng này đồng ý với tôi. Trên hệ thống của tôi, ít nhất, nó thậm chí không cần thiết.
LondonRob

Đây là câu trả lời.
Aerin

88

Thay vì thao tác, PYTHONPATHbạn cũng có thể tạo một tệp cấu hình đường dẫn . Trước tiên hãy tìm trong thư mục Python tìm kiếm thông tin này:

python -m site --user-site

Vì một số lý do, điều này dường như không hoạt động trong Python 2.7. Ở đó bạn có thể sử dụng:

python -c 'import site; site._script()' --user-site

Sau đó tạo một .pthtệp trong thư mục đó chứa đường dẫn bạn muốn thêm (tạo thư mục nếu nó không tồn tại).

Ví dụ:

# find directory
SITEDIR=$(python -m site --user-site)

# create if it doesn't exist
mkdir -p "$SITEDIR"

# create new .pth file with our path
echo "$HOME/foo/bar" > "$SITEDIR/somelib.pth"

Tôi đã thử điều này bằng Python 2.6 và nó dường như không hoạt động với tôi
Lorcan O'Nill 26/2/13

4
Tôi chỉ liên kết symlink thư mục này với thư mục thư viện của riêng tôi và lưu trữ tất cả các tập lệnh của tôi ở đó. Làm việc tốt
firesofmay

Đã giải quyết để thử lại sau khi tìm thấy chủ đề này một lần nữa và quản lý để làm cho nó hoạt động như trên lần này! Lời xin lỗi được nâng cấp và phản đối :)
Lorcan O'Neill

Điều này hoạt động hoàn hảo, tôi đã đi đúng hướng nhưng python -m site --user-site(create the directory if it doesn't exist)các bộ phận là những gì tôi đã thiếu để làm cho nó hoạt động.
Aurélien Ooms

1
Tôi có cần thực hiện thêm một bước để python có thể nhận ra đường dẫn được thêm vào somelib.pthkhông? Nếu không, bất kỳ dự đoán tại sao điều này có thể không hoạt động?
Miladiouss

38

Điều này hoạt động trên Windows

  1. Trên Windows, với Python 2.7, hãy chuyển đến thư mục thiết lập Python.
  2. Mở Lib / gói trang web.
  3. Thêm một tập tin trống example.pth vào thư mục này.
  4. Thêm đường dẫn cần thiết vào tệp, mỗi đường dẫn.

Sau đó, bạn sẽ có thể thấy tất cả các mô-đun trong các đường dẫn đó từ tập lệnh của mình.


3
IMO, đây là giải pháp tốt nhất, vì nó không phụ thuộc vào sự lựa chọn vỏ hay môi trường làm việc. Cũng hoạt động trên linux, trong đó đường dẫn python mặc định là "/usr/local/lib/pythonX.Y/site-packages". Nếu điều đó không hiệu quả, hãy thử đặt tệp .pth của bạn vào thư mục dist-gói thay thế.
matus

1
Windows 7, Python 3.6.5. Đây là câu trả lời. Như auserdude đã viết: Tạo "example.pth" trong thư mục Lib / site-gói của Python và sau đó thêm đường dẫn của bạn như sau: C: \ somefolder \ Anotherfolder \ targetfolder
JayJay123

câu trả lời tuyệt vời, cũng hoạt động với python 3.7 trên windows 10, đường dẫn windows 10 của tôi là: "C: \ Users \ {usrName} \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib"
Ali80 29/11/18

Có thể xác nhận rằng nó hoạt động cho Python 3.6.7 trên Windows 10. Tuy nhiên, lưu ý rằng đường dẫn được gắn vào PYTHONPATH của bạn với nghĩa là mô-đun được nối thêm của bạn sẽ không được tìm thấy trong trường hợp va chạm tên.
BramAppel

25

Trong trường hợp bất cứ ai vẫn còn bối rối - nếu bạn đang sử dụng máy Mac, hãy làm như sau:

  1. Mở Terminal
  2. Kiểu open .bash_profile
  3. Trong tệp văn bản bật lên, thêm dòng này ở cuối: export PYTHONPATH=$PYTHONPATH:foo/bar
  4. Lưu tệp, khởi động lại Terminal và bạn đã hoàn tất

2
Bất cứ ai tự hỏi làm thế nào để xem đường đi của trăn, hãy sử dụng: con trăn nào
Arindam Roychowdhury

khá chắc chắn rằng bạn cũng cần tải lại thiết bị đầu cuối
Người dùng

thực sự exportchìa khóa là thứ mà tôi đã thiếu !!!!, được nâng cấp, cảm ơn rất nhiều!
a_m_dev

21

Bạn có thể thêm đường dẫn qua tệp pythonrc, mặc định là ~ / .pythonrc trên linux. I E.

import sys
sys.path.append('/path/to/dir')

Bạn cũng có thể đặt PYTHONPATHbiến môi trường, trong tệp RC toàn cầu, chẳng hạn như ~/.profiletrên mac hoặc linux hoặc thông qua Bảng điều khiển -> Hệ thống -> tab Nâng cao -> Biến môi trường trên các cửa sổ.


40
sys.path.append ('/ path / to / dir') không thêm mục nhập vĩnh viễn.
jeremyjjbrown

15

Để giải thích thêm một chút, Python sẽ tự động xây dựng các đường dẫn tìm kiếm của nó (như đã đề cập ở trênở đây ) bằng cách sử dụng site.pytập lệnh (thường nằm trong sys.prefix + lib/python<version>/site-packagescũng như lib/site-python). Người ta có thể có được giá trị của sys.prefix:

python -c 'import sys; print(sys.prefix)'

Các kịch bản site.py sau đó bổ sung thêm một số thư mục, phụ thuộc vào nền tảng này, chẳng hạn như /usr/{lib,share}/python<version>/dist-packages, /usr/local/lib/python<version>/dist-packagesđể con đường tìm kiếm và cũng có thể tìm kiếm trên các con đường để <package>.pthcấu hình các file có chứa đường dẫn tìm kiếm bổ sung cụ thể. Ví dụ , cài đặt dễ dàng duy trì bộ sưu tập các gói đã cài đặt được thêm vào một tệp cụ thể của hệ thống, ví dụ như trên Ubuntu /usr/local/lib/python2.7/dist-packages/easy-install.pth. Trên một hệ thống điển hình, có một loạt các tệp .pth xung quanh có thể giải thích một số đường dẫn không mong muốn trong sys.path:

python -c 'import sys; print(sys.path)'

Vì vậy, người ta có thể tạo một tệp .pth và đặt vào bất kỳ thư mục nào trong số này (bao gồm cả sitedir như đã đề cập ở trên ). Đây dường như là cách mà hầu hết các gói được thêm vào sys.path trái ngược với việc sử dụng PYTHONPATH.

Lưu ý: Trên OSX có một đường dẫn tìm kiếm bổ sung đặc biệt được thêm bởi site.py cho 'khung xây dựng' (nhưng dường như hoạt động đối với việc sử dụng python dòng lệnh thông thường): /Library/Python/<version>/site-packages(ví dụ: Python2.7 :) /Library/Python/2.7/site-packages/là nơi các gói bên thứ 3 được cho là để được cài đặt (xem README trong thư mục đó). Vì vậy, người ta có thể thêm một tập tin cấu hình đường dẫn trong đó có chứa đường dẫn tìm kiếm bổ sung ví dụ như tạo ra một tập tin gọi là /Library/Python/2.7/site-packages/pip-usr-local.pthchứa /usr/local/lib/python2.7/site-packages/và sau đó hệ thống sẽ python thêm rằng con đường tìm kiếm.


10

Đối với tôi nó hoạt động khi tôi thay đổi .bash_profiletập tin. Chỉ thay đổi .bashrctập tin chỉ hoạt động cho đến khi tôi khởi động lại shell.

Đối với python 2.7, nó sẽ trông giống như:

export PYTHONPATH="$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python"

ở cuối .bash_profiletập tin


1
Nếu tôi hiểu chính xác thì điều này sẽ xuất biến cho các phiên Python được khởi chạy chỉ qua thiết bị đầu cuối phải không?
jxramos

1
@jxramos - vâng!
Peter Piper

9

Trên linux, bạn có thể tạo một liên kết tượng trưng từ gói của bạn đến một thư mục của PYTHONPATH mà không phải xử lý các biến môi trường. Cái gì đó như:

ln -s /your/path /usr/lib/pymodules/python2.7/

7

Thêm export PYTHONPATH="${PYTHONPATH}:/my/other/path"vào ~ / .bashrc có thể không hoạt động nếu PYTHONPATHhiện không tồn tại (vì :).

export PYTHONPATH="/my/other/path1"
export PYTHONPATH="${PYTHONPATH}:/my/other/path2"

Thêm phần trên vào ~ / .bashrc đã giúp tôi trên Ubuntu 16.04


Tôi đã làm echo PYTHONPATHvà không có gì xuất hiện! điều đó có nghĩa là PYTHONPATH này chưa được khởi tạo, vì vậy tôi chỉ cần dán dòng này export PYTHONPATH=$PYTHONPATH:<PATH_TO_TF>/TensorFlow/models/research/object_detectionvào ~/.bashrctệp của mình và source ~/.bashrc nó. Sau này, khi tôi thực hiện 'echo $ PYTHONPATH`, nó đã cho tôi :<PATH_TO_TF>/TensorFlow/models/research/object_detection, Có gợi ý nào về việc tôi đã làm gì sai không?
Anu

export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detection, khi bạn xuất PYTHONPATH lần đầu tiên, bạn phải làm điều đó mà không có ${PYTHONPATH}:phần
boyangeor

Cảm ơn, nhưng bất cứ khi nào tôi khởi động lại máy tính, đường dẫn python sẽ được đặt lại thành đường dẫn tôi đặt số 1 tức là :<PATH_TO_TF>/TensorFlow/models/research/object_detectionvà xóa thứ 2 export PYTHONPATH=$PYTHONPATH:/TensorFlow/models/research/slim. Bất kỳ đề nghị về điều đó, làm thế nào để khắc phục nó?
Anu

7

Trên MacOS, Thay vì đưa đường dẫn đến một thư viện cụ thể. Đưa đường dẫn đầy đủ đến thư mục gốc của dự án

~/.bash_profile 

làm cho ngày của tôi, ví dụ:

export PYTHONPATH="${PYTHONPATH}:/Users/<myuser>/project_root_folder_path"

sau này làm:

source ~/.bash_profile

6

Chỉ cần thêm vào câu trả lời của awesomo, bạn cũng có thể thêm dòng đó vào ~/.bash_profilehoặc~/.profile


Thêm vào .bash_profilenếu bạn sử dụng shell đăng nhập, nếu không hãy sử dụng.profile
smac89

3

Việc thêm một đường dẫn mới vào PYTHONPATH đang thực hiện thủ công bằng cách:

thêm đường dẫn vào hồ sơ ~ / .bashrc của bạn, trong terminal bằng:

vim ~/.bashrc

dán sau đây vào hồ sơ của bạn

export PYTHONPATH="${PYTHONPATH}:/User/johndoe/pythonModule"

sau đó, hãy đảm bảo nguồn hồ sơ bashrc của bạn khi bạn chạy mã trong thiết bị đầu cuối:

source ~/.bashrc 

Hi vọng điêu nay co ich.


2

Tôi đã thêm vĩnh viễn trong Windows Vista, Python 3.5

Hệ thống> Bảng điều khiển> Cài đặt hệ thống nâng cao> Nâng cao (nhấn) Biến môi trường> Biến hệ thống> (nếu bạn không thấy PYTHONPATH trong cột Biến) (nhấp) Mới> Tên biến: PYTHONPATH> Giá trị biến:

Xin vui lòng, viết thư mục trong giá trị biến. Đó là chi tiết câu trả lời của Blue Peppers.


1

Kịch bản bên dưới hoạt động trên tất cả các nền tảng vì nó là Python thuần túy. Nó sử dụng Đường dẫn pathlib, được ghi lại ở đây https://docs.python.org/3/l Library / pathlib.html , để làm cho nó hoạt động đa nền tảng. Bạn chạy nó một lần, khởi động lại kernel và đó là nó. Lấy cảm hứng từ https://medium.com/@arnaud.bertrand/modifying-python-s-search-path-with-pth-files-2a41a4143574 .

from pathlib import Path
to_add=Path(path_of_directory_to_add)
from sys import path

if str(to_add) not in path:
    minLen=999999
    for index,directory in enumerate(path):
        if 'site-packages' in directory and len(directory)<=minLen:
            minLen=len(directory)
            stpi=index

    pathSitePckgs=Path(path[stpi])
    with open(str(pathSitePckgs/'current_machine_paths.pth'),'w') as pth_file:
        pth_file.write(str(to_add))

1

Đây là một bản cập nhật cho chủ đề này có một số câu trả lời cũ.

Đối với những người sử dụng MAC-OS Catalina hoặc một số mới hơn (> = 10.15), nó đã được giới thiệu một Terminal mới có tên zsh(thay thế cho cái cũ bash).

Tôi đã gặp một số vấn đề với các câu trả lời ở trên do thay đổi này và tôi đã phần nào khắc phục bằng cách tạo tệp ~/.zshrcvà dán thư mục tệp vào $PATH$PYTHONPATH

Vì vậy, đầu tiên tôi đã làm:

nano ~/.zshrc

Khi trình soạn thảo mở, tôi dán nội dung sau:

export PATH="${PATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"
export PYTHONPATH="${PYTHONPATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"

lưu nó và khởi động lại thiết bị đầu cuối.

QUAN TRỌNG: Đường dẫn trên được đặt thành đường dẫn máy tính của tôi, bạn sẽ phải điều chỉnh nó với con trăn của mình.


0

Trong Python 3.6.4, bạn có thể duy trì sys.path qua các phiên python như thế này:

import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print(f"current working dir: {dir_path}")

root_dir = dir_path.replace("/util", '', 1)
print(f"root dir: {root_dir}")

sys.path.insert(0, root_dir)

print(str(sys.path))

Tôi thực sự khuyên bạn nên sử dụng virtualenv và virtualenvwrapper nếu không bạn sẽ làm lộn xộn đường dẫn của mình


-3

Đường đi ngắn nhất giữa A <-> B là một đường thẳng;

import sys
if not 'NEW_PATH' in sys.path:
  sys.path += ['NEW_PATH']
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.