@Channelchan
2019-03-14T02:35:49.000000Z
字数 3829
阅读 1376
python基础
在python中使用import导入模块时解释器会采用以下规则查找模块文件:
sys.path(list)中的路径为根目录。import输入的文件名在每一个根目录中查找指定的文件。sys.path路径下都找不到对应的文件则抛出ImportErrorsys.path中主要包含下列路径: pip install或conda install安装的包都在这些目录中)。PYTHONPATH指定的路径。
import sysprint(sys.path)
['D:\ADX-StrategyPool\test', 'D:\ADX-StrategyPool', 'D:\vnpy_fxdayu', 'C:\ProgramData\Anaconda3\envs\vnpy\python36.zip', 'C:\ProgramData\Anaconda3\envs\vnpy\DLLs', 'C:\ProgramData\Anaconda3\envs\vnpy\lib', 'C:\ProgramData\Anaconda3\envs\vnpy', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\Sphinx-1.5.6-py3.6.egg', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\win32', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\win32\lib', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\Pythonwin', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\setuptools-27.2.0-py3.6.egg']
sys.path 在生成时会将环境变量PYTHONPATH中指定的路径添加进去,因此可以通过修改环境变量的方式增加导入模块的引用地址。
在外部路径"E:\oes"创建文件iptest.py
print("---------------iptest---------------")
尝试直接导入
import sysprint(sys.path)import iptest
['D:\ADX-StrategyPool\test', 'D:\ADX-StrategyPool', 'D:\vnpy_fxdayu', 'C:\ProgramData\Anaconda3\envs\vnpy\python36.zip', 'C:\ProgramData\Anaconda3\envs\vnpy\DLLs', 'C:\ProgramData\Anaconda3\envs\vnpy\lib', 'C:\ProgramData\Anaconda3\envs\vnpy', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\Sphinx-1.5.6-py3.6.egg', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\win32', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\win32\lib', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\Pythonwin', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\setuptools-27.2.0-py3.6.egg']
Traceback (most recent call last):
File "path.py", line 4, in
import iptest
ModuleNotFoundError: No module named 'iptest'
失败!!!
手动添加路径后导入
import syssys.path.append(r"E:\oes")print(sys.path)import iptest
['D:\ADX-StrategyPool\test', 'D:\ADX-StrategyPool', 'D:\vnpy_fxdayu', 'C:\ProgramData\Anaconda3\envs\vnpy\python36.zip', 'C:\ProgramData\Anaconda3\envs\vnpy\DLLs', 'C:\ProgramData\Anaconda3\envs\vnpy\lib', 'C:\ProgramData\Anaconda3\envs\vnpy', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\Sphinx-1.5.6-py3.6.egg', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\win32', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\win32\lib', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\Pythonwin', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\setuptools-27.2.0-py3.6.egg', 'E:\oes'] #<---这里多了一个路径。
---------------iptest---------------
成功
通过修改环境变量导入
windows cmd:
set PYTHONPATH=E:/oes
linux terminal / git bash / macos termminal:
export PYTHONPATH=/e/oes
文件path.py
import sysprint(sys.path)import iptest
在修改了环境变量的终端运行脚本:
['D:\ADX-StrategyPool\test', 'E:\oes', 'C:\ProgramData\Anaconda3\envs\vnpy\python36.zip', 'C:\ProgramData\Anaconda3\envs\vnpy\DLLs', 'C:\ProgramData\Anaconda3\envs\vnpy\lib', 'C:\ProgramData\Anaconda3\envs\vnpy', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\Sphinx-1.5.6-py3.6.egg', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\win32', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\win32\lib', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\Pythonwin', 'C:\ProgramData\Anaconda3\envs\vnpy\lib\site-packages\setuptools-27.2.0-py3.6.egg']
---------------iptest---------------
成功
vscode可以自己指定在集成环境中使用的终端,默认为系统终端,也可以通过配置修改为其他终端。
cmd修改为git bash生成的终端会包含系统及当前用户环境变量,可以在vscode用户配置或项目配置中增加设置为生成的终端添加额外的环境变量。
sample,windows下添加PYTHONPATH环境变量,在该项目下的所有终端会带有该环境变量,在这些终端下运行python会在sys.path中包含这些路径,因此可以从这些路径导入包 !

https://docs.python.org/3/using/cmdline.html#environment-variables
