1. 概述
我不明白如何让 全局 site-packages 路径 在每次启动 Sublime Text 3 时添加到 Sublime Text 3 的 sys.path
中。
2. 原因
我希望在 Sublime Text 插件中可以使用全局安装的包。
更多信息请参见 Sublime Text 插件开发中的全局 Python 包 问题。
3. 示例
我的插件示例:
import os
import sublime_plugin
import sys
from duckduckgo import query # noqa
from pygoogling.googling import GoogleSearch # noqa
# Any actions
需要翻译的内容:
这里有两个Python模块duckduckgo
和pygoogling.googling
,它们都在site-packages
文件夹中。
4. 未能帮助
4.1. 手动添加路径到控制台
我打开Sublime Text控制台 → 我将以下内容粘贴到其中:
import sys; sys.path.append('C:\Python36\Lib\site-packages')
现在:
>>> sys.path
['D:\\Sublime Text Build 3143 x64 For Debug', 'D:\\Sublime Text Build 3143 x64 For Debug\\python3.3.zip', 'D:\\Sublime Text Build 3143 x64 For Debug\\Data\\Lib\\python3.3', 'D:\\Sublime Text Build 3143 x64 For Debug\\Data\\Packages', 'C:\\Python36\\Lib\\site-packages']
我重新启动了Sublime Text→ 我打开了Sublime Text控制台:
>>> import sys; sys.path
['D:\\Sublime Text Build 3143 x64 For Debug', 'D:\\Sublime Text Build 3143 x64 For Debug\\python3.3.zip', 'D:\\Sublime Text Build 3143 x64 For Debug\\Data\\Lib\\python3.3', 'D:\\Sublime Text Build 3143 x64 For Debug\\Data\\Packages']
环境变量是手动添加的,在每次重启后都会被清除。
4.2. 使用 PYTHONPATH
我的解释器中的 PYTHONPATH
用户变量:
>>> import sys; sys.path
['', 'C:\\Python36', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36\\lib\\site-packages']
我修改了我的插件:
import os
import sublime_plugin
import sys
sys.path.append((os.environ['PYTHONPATH']))
from duckduckgo import query # noqa
from pygoogling.googling import GoogleSearch # noqa
# Any actions
现在:
>>> import sys; sys.path
['D:\\Sublime Text Build 3143 x64 For Debug', 'D:\\Sublime Text Build 3143 x64 For Debug\\python3.3.zip', 'D:\\Sublime Text Build 3143 x64 For Debug\\Data\\Lib\\python3.3', 'D:\\Sublime Text Build 3143 x64 For Debug\\Data\\Packages', 'C:\\Python36']
但是,Sublime Text不接受来自site-packages
的模块:
reloading plugin KristinitaLuckyLink.KristinitaLuckyLink
Traceback (most recent call last):
File "D:\Sublime Text Build 3143 x64 For Debug\sublime_plugin.py", line 109, in reload_plugin
m = importlib.import_module(modulename)
File "./python3.3/importlib/__init__.py", line 90, in import_module
File "<frozen importlib._bootstrap>", line 1584, in _gcd_import
File "<frozen importlib._bootstrap>", line 1565, in _find_and_load
File "<frozen importlib._bootstrap>", line 1532, in _find_and_load_unlocked
File "D:\Sublime Text Build 3143 x64 For Debug\sublime_plugin.py", line 915, in load_module
exec(compile(source, source_path, 'exec'), mod.__dict__)
File "D:\Sublime Text Build 3143 x64 For Debug\Data\Packages\KristinitaLuckyLink\KristinitaLuckyLink.py", line 40, in <module>
from duckduckgo import query # noqa
ImportError: No module named 'duckduckgo'
4.3. site-packages环境变量
我按照 Anthony Perrot的答案 修改了我的插件:
import os
import sublime_plugin
import sys
python_environment_variable = (os.environ['PYTHONPATH'])
sys.path.append(python_environment_variable)
site_packages = next(p for p in python_environment_variable if 'site-packages' in p)
sys.path.append(site_packages)
from duckduckgo import query # noqa
from pygoogling.googling import GoogleSearch # noqa
# Any actions
我在控制台中遇到了 StopIteration 异常:
reloading plugin KristinitaLuckyLink.KristinitaLuckyLink
Traceback (most recent call last):
File "D:\Sublime Text Build 3143 x64 For Debug\sublime_plugin.py", line 109, in reload_plugin
m = importlib.import_module(modulename)
File "./python3.3/importlib/__init__.py", line 90, in import_module
File "<frozen importlib._bootstrap>", line 1584, in _gcd_import
File "<frozen importlib._bootstrap>", line 1565, in _find_and_load
File "<frozen importlib._bootstrap>", line 1532, in _find_and_load_unlocked
File "D:\Sublime Text Build 3143 x64 For Debug\sublime_plugin.py", line 915, in load_module
exec(compile(source, source_path, 'exec'), mod.__dict__)
File "D:\Sublime Text Build 3143 x64 For Debug\Data\Packages\KristinitaLuckyLink\KristinitaLuckyLink.py", line 36, in <module>
site_packages = next(p for p in python_environment_variable if 'site-packages' in p)
StopIteration
5. 工作了,但出乎意料
5.1. 工作示例
我将新的环境变量添加到我的操作系统中,例如:
PYTHONPACKAGES=C:\Python36\Lib\site-packages
其中:
PYTHONPACKAGES
— 变量名,C:\Python36\Lib\site-packages
— 全局的 site-packages 路径.
并且 修改我的插件:
import os
import sublime_plugin
import sys
sys.path.append((os.environ['PYTHONPACKAGES']))
from duckduckgo import query # noqa
from pygoogling.googling import GoogleSearch # noqa
# Any actions
插件将会成功运行。
5.2. 不符合预期的原因
每个下载我的插件的用户都需要为操作系统添加PYTHONPACKAGES
环境变量,并可能需要重新启动操作系统。
如果插件的用户不需要添加环境变量就可以使用插件,那将是非常好的。
期望的行为:用户安装插件→ 用户可以在不进行额外设置的情况下使用插件。
6. 不要提供
- 请不要建议我不使用全局模块,而是需要将外部模块集成到插件文件夹中。
pip install examplemodule
。//每个使用您软件包的用户都必须安装Python 3.3 — 是的,Sublime Text软件包的所有模块都必须与Python 3.3兼容,但全局用户可以安装更高版本的Python。我使用最新稳定版本(当时的3.6.4)。谢谢。 - Саша ЧерныхPYTHONPATH
变量包含所有安装 Python 的用户。site-packages
是PYTHONPATH
的一部分。如果可以不添加新的环境变量,而是使用已经存在的PYTHONPATH
,那就太好了。谢谢。 - Саша Черных