簡體   English   中英

在 PYTHONPATH 中究竟應該設置什么?

[英]What exactly should be set in PYTHONPATH?

我正在為 Python 項目的其他開發人員編寫安裝文檔,並且我一直在閱讀PYTHONPATH環境變量。 我正在查看我當前的開發系統,並認為我有一些設置錯誤導致我的 IDE (IntelliJ) 在查找 python 庫時行為不正確。

我已經查看了此處此處的文檔,但我仍然不確定PYTHONPATH環境變量中的實際內容。

我讓PYTHONHOME指向了 `C:\\Python27'。

我當前的PYTHONPATH設置為PYTHONHOME 我還應該從sys.path添加目錄嗎?

更新:

根據以下信息,不需要設置PYTHONPATH ,除非您希望 python 默認能夠找到非標准庫。 例如,當我從安裝程序安裝wxPython時,它會將其庫添加到PYTHONPATH 我確實將PYTHONHOME設置為 python 安裝的根目錄,以便我可以將它添加到我的系統PATH環境變量中,以便我可以從任何地方運行 python。

您不必設置其中任何一個。 可以將PYTHONPATH設置為指向其中包含私有庫的其他目錄。 如果未設置PYTHONHOME,則Python默認使用找到python.exe的目錄,因此dir應位於PATH中。

對於大多數安裝,您不應設置這些變量,因為Python不需要它們運行。 Python知道在哪里可以找到它的標准庫。

設置PYTHONPATH的唯一原因是維護您不想在全局默認位置(即site-packages目錄)中安裝的自定義Python庫的目錄。

請務必閱讀: http//docs.python.org/using/cmdline.html#environment-variables

這是我學到的:PYTHONPATH是一個添加到Python導入搜索路徑“sys.path”的目錄,它由當前目錄組成。 CWD,PYTHONPATH,標准和共享庫以及客戶庫。 例如:

% python3 -c "import sys;print(sys.path)"
['', 
'/home/username/Documents/DjangoTutorial/mySite', 
'/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', 
'/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']

其中第一條路徑''表示當前目錄。第二條路徑是via

%export PYTHONPATH=/home/username/Documents/DjangoTutorial/mySite 

可以添加到〜/ .bashrc中以使其永久化,其余的是Python標准和動態共享庫以及第三方庫,如django。

如上所述,不要亂用PYTHONHOME,即使將其設置為''或'None'也會導致python3 shell停止工作:

% export PYTHONHOME=''
% python3
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00007f18a44ff740 (most recent call first):
Aborted (core dumped)

請注意,如果啟動Python腳本,CWD將成為腳本的目錄。 例如:

username@bud:~/Documents/DjangoTutorial% python3 mySite/manage.py runserver
==== Printing sys.path ====
/home/username/Documents/DjangoTutorial/mySite # CWD is where manage.py resides
/usr/lib/python3.6
/usr/lib/python3.6/lib-dynload
/usr/local/lib/python3.6/dist-packages
/usr/lib/python3/dist-packages

您還可以在運行時追加sys.path的路徑:假設您在〜/ Documents / Python目錄中有一個文件Fibonacci.py:

username@bud:~/Documents/DjangoTutorial% python3 
>>> sys.path.append("/home/username/Documents")
>>> print(sys.path)
['', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', 
'/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages', 
'/home/username/Documents']
>>> from Python import Fibonacci as fibo

或通過

% PYTHONPATH=/home/username/Documents:$PYTHONPATH
% python3
>>> print(sys.path)
['', 
'/home/username/Documents', '/home/username/Documents/DjangoTutorial/mySite', 
'/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', 
'/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']
>>> from Python import Fibonacci as fibo

使用帶有pip命令的標志-e存在比直接操作PYTHONPATH少一點的“臨時”解決方案,並允許無縫安裝可以導入的本地庫,並重新導入以反映所做的更改。

為了能夠像import mypackage任何其他模塊一樣import mypackage ,正確的方法是在本地使用 pip:

python -m pip install -e /path_to_package/mypackage/

  • python -m確保您使用的是當前使用的同一個python安裝中的 pip 包。

  • -e使其可編輯,i/e import mypackage將在您進行一些更改后重新加載,而不是使用緩存的。

mypackage必須是可安裝的軟件包,I / E包含一個__init__.py文件,和一個基本setup.py (或pyproject.toml用於文件pipenv

最小設置setup.py

from setuptools import find_packages, setup

setup(
    name='mypackage',          # Required
    version='0.0.1',           # Required
    packages=find_packages(),  # Required
)

包結構必須是這樣的:

mypackage/
    setup.py
    mypackage/    <----- this is a folder inside the other `mypackage/` folder
        __init__.py

或作為一棵樹:

└── python_perso                folder
    └── mypackage                   folder
        ├── mypackage                   folder
        │   └── __init__.py
        └── setup.py

[編輯] 安裝后,目錄將如下所示:
(對於名為mypackage的包)

└── python_perso
    └── mypackage
        ├── mypackage
        │   ├── __init__.py
        │   └── __pycache__
        │       └── __init__.cpython-38.pyc
        ├── mypackage.egg-info
        │   ├── PKG-INFO
        │   ├── SOURCES.txt
        │   ├── dependency_links.txt
        │   └── top_level.txt
        └── setup.py

5 directories, 7 files

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM