[关闭]
@Channelchan 2019-03-14T10:35:49.000000Z 字数 3829 阅读 1245

PYTHON导入模块机制说明

python基础

在python中使用import导入模块时解释器会采用以下规则查找模块文件:

sys.path

  1. import sys
  2. print(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

  1. print("---------------iptest---------------")

尝试直接导入

  1. import sys
  2. print(sys.path)
  3. 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'

失败!!!


手动添加路径后导入

  1. import sys
  2. sys.path.append(r"E:\oes")
  3. print(sys.path)
  4. 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

  1. import sys
  2. print(sys.path)
  3. 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中设置环境变量

vscode可以自己指定在集成环境中使用的终端,默认为系统终端,也可以通过配置修改为其他终端。

生成的终端会包含系统及当前用户环境变量,可以在vscode用户配置或项目配置中增加设置为生成的终端添加额外的环境变量。

sample,windows下添加PYTHONPATH环境变量,在该项目下的所有终端会带有该环境变量,在这些终端下运行python会在sys.path中包含这些路径,因此可以从这些路径导入包 !

image.png-59.8kB

PYTHON官方文档

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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注