You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django项目中如何从外部目录导入函数与变量?解决相对导入报错

问题描述

我想从Django应用当前目录的5级上层目录导入函数和常量,但要导入的包在Django应用之外,Django无法识别它。

项目结构如下:

├── lawcrawler
│   ├── get_all_amended_laws_urls.py # 要从这个文件导入函数
│   ├── lawcrawler
│   │   └── spiders
│   │       └── settings.py # 要从这个文件导入变量
│
├── project
│   ├── apps
│   │   ├── laws
│   │       ├── management
│   │           ├── commands
│   │               ├── add_list_of_amended_laws.py # 需要导入到这个文件
│   ├── manage.py

按照Python相对导入规则,我尝试了以下写法:

from .......lawcrawler.lawcrawler.spiders.settings import SPARQL_ENDPOINT, AMENDED_URL_FILE_PATH, get_law_amendment_query

以及:

from .....lawcrawler import get_all_amended_urls

但报错:

ImportError: attempted relative import with no known parent package
解决方案

方法1:手动添加路径到Python搜索路径

在add_list_of_amended_laws.py开头添加代码,把lawcrawler所在的根目录加入Python的模块搜索路径:

import sys
import os

# 获取当前文件绝对路径,回溯5级到包含lawcrawler和project的根目录
current_file_path = os.path.abspath(__file__)
root_dir = os.path.abspath(os.path.join(current_file_path, '../../../../..'))

# 将根目录加入sys.path
if root_dir not in sys.path:
    sys.path.append(root_dir)

# 直接导入目标模块
from lawcrawler.get_all_amended_laws_urls import get_all_amended_urls
from lawcrawler.lawcrawler.spiders.settings import SPARQL_ENDPOINT, AMENDED_URL_FILE_PATH, get_law_amendment_query

方法2:将外部包安装为可编辑模块

如果lawcrawler可以打包,用pip安装为可编辑模式,让Python全局识别这个包:

  1. 在lawcrawler目录下创建setup.py文件,示例内容:
from setuptools import setup, find_packages

setup(
    name="lawcrawler",
    version="0.1",
    packages=find_packages(),
)
  1. 执行安装命令:
pip install -e /path/to/lawcrawler

之后在Django命令文件里直接导入即可:

from lawcrawler.get_all_amended_laws_urls import get_all_amended_urls
from lawcrawler.lawcrawler.spiders.settings import SPARQL_ENDPOINT, AMENDED_URL_FILE_PATH, get_law_amendment_query

方法3:修改Django配置全局添加路径

在Django项目的settings.py中添加路径配置,让整个项目都能识别外部包:

import sys
import os

# 获取包含lawcrawler和project的根目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
root_dir = os.path.abspath(os.path.join(BASE_DIR, '..'))

if root_dir not in sys.path:
    sys.path.append(root_dir)

配置完成后,在add_list_of_amended_laws.py里直接导入目标模块即可。

内容的提问来源于stack exchange,提问作者Mahdi Jafari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:10:33