从绝对路径导入Python模块的方法

因为平时经常用一些未 pub 到 pypi 的包,而且又深感每次都要改 PYTHONPATH 或者手动管理 sys.path 麻烦,因此弄一个这样的包来从绝对路径 import。

Github URL:

aHR0cHM6Ly9naXRodWIuY29tL2xpbnRoaWVkYS9hYnNfaW1wb3J0

目前只会根据路径拓扑来找到最上级的 package, 虽然没有什么技术含量,但可能比较适合炼丹人士.

Contribution welcomed.


从绝对路径导入Python模块的方法

8 回复

感觉这种做法带来的问题比解决的问题多…


在Python里,从绝对路径导入模块,最直接的办法就是修改 sys.pathsys.path 是一个列表,Python解释器按顺序在里面找要导入的模块。你把绝对路径加进去,Python就能找到了。

比如你的模块在 /home/user/my_project/my_module.py,你可以这么干:

import sys
sys.path.insert(0, '/home/user/my_project')

import my_module

这里用 sys.path.insert(0, ...) 把路径插在最前面,确保优先搜索。用 sys.path.append(...) 也行,就是顺序靠后。

更规范的做法是用 importlib,特别是Python 3.5以后。这样更灵活,也不污染全局的 sys.path

import importlib.util
import sys

module_path = '/home/user/my_project/my_module.py'
module_name = 'my_module'

spec = importlib.util.spec_from_file_location(module_name, module_path)
module = importlib.util.module_from_spec(spec)
sys.modules[module_name] = module
spec.loader.exec_module(module)

# 现在就能用了
module.some_function()

spec_from_file_location 根据文件路径创建模块规范,module_from_spec 创建模块对象,塞进 sys.modulesexec_module 执行加载。这样模块名和路径就关联起来了。

如果是一整个包(有 __init__.py 的目录),方法也差不多,把目录路径加到 sys.path 或者用 importlib 处理 __init__.py 的路径就行。

总结:改 sys.path 最快,用 importlib 更干净。

这种,如果在生产环境使用……

换个环境就 GG

写个 url 还 hack 一下。累

炼丹人士是啥意思呀?


可能是身份尊贵的意思,炼丹的人在普通人中的地位都比较高

回到顶部