我可以pip3 install --user mypackage使用以下命令确定 pip 安装包二进制文件/脚本的位置:
$(python3 -m site --user-base)/bin
Run Code Online (Sandbox Code Playgroud)
是否有一种机制可以确定非用户二进制文件/脚本的安装位置(例如pip3 install mypackage)?
请注意,我只对二进制文件/脚本的安装位置感兴趣,而不是库代码的安装位置感兴趣。
更新:
目标是确保 PATH 环境变量包含安装二进制文件/脚本的文件夹,因为这在过去给我带来了一些问题。
更新2:
$ python3 -c "import sysconfig; print(sysconfig.get_path('scripts'))"
/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/bin
$ python3 -c "from pip._internal.locations import bin_py; print(bin_py)"
/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/bin
Run Code Online (Sandbox Code Playgroud)
但是,pip3 安装到/usr/local/bin
注意:
$ which pip3
/usr/local/bin/pip3
$ which python3
/usr/local/bin/python3
Run Code Online (Sandbox Code Playgroud)
这已经在这里得到了回答(但我不能“关闭重复”,因为有赏金):
我相信规范的方法(未来)是使用sysconfig.get_path(...). 根据具体需要,可以将schema和name结合起来。所以也许对于您的确切用例:
import sysconfig
scripts_path = sysconfig.get_path('scripts')
print(scripts_path)
Run Code Online (Sandbox Code Playgroud)
作为shell 中的一行:
python -c "import sysconfig; print(sysconfig.get_path('scripts'))"
Run Code Online (Sandbox Code Playgroud)
其他可能有助于识别正确目录的事情:
python -m site
Run Code Online (Sandbox Code Playgroud)
python -m sysconfig
Run Code Online (Sandbox Code Playgroud)
参考:
pip的来源pip的源代码_internal/locations.py显示了如何解析系统bin路径:
https://github.com/pypa/pip/blob/3fe826c699d85eccc7ebf16f4d86c851b2a1e705/src/pip/_internal/locations.py#L63-L91
if WINDOWS:
bin_py = os.path.join(sys.prefix, 'Scripts')
bin_user = os.path.join(user_site, 'Scripts')
# buildout uses 'bin' on Windows too?
if not os.path.exists(bin_py):
bin_py = os.path.join(sys.prefix, 'bin')
bin_user = os.path.join(user_site, 'bin')
else:
bin_py = os.path.join(sys.prefix, 'bin')
bin_user = os.path.join(user_site, 'bin')
# Forcing to use /usr/local/bin for standard macOS framework installs
# Also log to ~/Library/Logs/ for use with the Console.app log viewer
if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/':
bin_py = '/usr/local/bin'
Run Code Online (Sandbox Code Playgroud)
一些额外的文档sys.prefix可以在这里找到:https ://docs.python.org/3/library/sys.html#sys.prefix
根据 Git 历史记录,自 2017 年以来,此解析行为一直没有被触及。尝试跟踪此变量的使用情况似乎并不表明此变量是pip直接通过命令公开的。
由于这似乎没有直接在 CLI 中公开,因此您可以导入脚本来访问解析的 bin 位置:
python -c "from pip._internal.locations import bin_py; print(bin_py)"
Run Code Online (Sandbox Code Playgroud)
例如:
在 Linux 上:
$ python -c "from pip._internal.locations import bin_py; print(bin_py)"
/usr/local/bin
Run Code Online (Sandbox Code Playgroud)
这似乎与具有脚本/bin 的脚本安装位置相匹配。例如
$ pip install uvicorn >/dev/null && which uvicorn
/usr/local/bin/uvicorn
Run Code Online (Sandbox Code Playgroud)
$ pip install --user uvicorn >/dev/null && find "$(python3 -m site --user-base)/bin"
/root/.local/bin
/root/.local/bin/uvicorn
Run Code Online (Sandbox Code Playgroud)
在 Windows 上:
$ python -c "from pip._internal.locations import bin_py; print(bin_py)"
C:\Users\[REDACTED]\AppData\Local\Programs\Python\Python38\Scripts
Run Code Online (Sandbox Code Playgroud)
此方法也适用于查找虚拟环境的 bin 目录。
| 归档时间: |
|
| 查看次数: |
3283 次 |
| 最近记录: |