You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python模块函数复用导入失败求助:如何在test1.py中调用test.py的函数?

Python模块函数复用导入失败求助:如何在test1.py中调用test.py的函数?

Hey,我来帮你搞定这个模块导入的问题!先明确下你的目录结构(我整理得更清晰些):

project
├── code
└── betacode
    └── naming
        └── test
            ├── test.py
            └── test1.py

你在test.py里定义了give_date()函数,想在同目录的test1.py里调用它,但之前的导入方式都报错,核心原因是Python的模块搜索路径没配置对,或者导入方式不符合包的规则。下面给你几个可行的解决方案:

方案一:用相对导入(最简单,适合同目录模块)

因为test.pytest1.py在同一个test目录下,直接用相对导入就行:
test1.py里写:

# 直接导入函数
from .test import give_date

# 调用试试
print(give_date())

或者如果你想导入整个模块:

import .test as test_module
print(test_module.give_date())

⚠️ 注意:这种方式下,不能直接双击运行test1.py或者用python test1.py执行,因为相对导入是针对Python包的,直接运行会把它当成独立脚本,导致报错。你需要从project目录下,用模块方式运行:

python -m betacode.naming.test.test1

方案二:绝对导入(需配置搜索路径)

如果你习惯用绝对导入,需要让Python能找到project目录(也就是betacode的父目录),有两种方法:

方法1:在代码里临时添加路径

test1.py的最开头加上这段代码,把project目录加到Python的搜索路径里:

import sys
import os

# 获取当前文件的目录,然后往上跳3级到project目录
project_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../'))
sys.path.append(project_path)

# 现在就可以用绝对导入了
from betacode.naming.test.test import give_date
print(give_date())

方法2:设置环境变量(一劳永逸)

project目录的路径加到PYTHONPATH环境变量里,这样Python每次运行都会自动搜索这个路径:

  • Linux/macOS终端
    export PYTHONPATH=/你自己的project路径:$PYTHONPATH
    
    比如你的project在/home/user/projects/my_project,就写:
    export PYTHONPATH=/home/user/projects/my_project:$PYTHONPATH
    
  • Windows命令行
    set PYTHONPATH=C:\你的project路径;%PYTHONPATH%
    

设置完之后,你在test1.py里直接用之前尝试的绝对导入就行:

from betacode.naming.test.test import give_date
print(give_date())

方案三:补充__init__.py(可选,但更规范)

虽然Python 3.3+不需要__init__.py也能识别包,但在betacodenamingtest这三个目录下各创建一个空的__init__.py文件,能让包结构更清晰,也能避免一些奇怪的导入问题。

为什么你之前的导入会失败?

  • import betacode.naming.test.test报错:因为Python的默认搜索路径里没有包含project目录,所以找不到betacode这个顶层包。
  • from test.test import give_date报错:Python会在当前目录和搜索路径里找test包,但当前目录就是test,所以它会把这个目录当成test包,找不到里面的test子模块(也就是test.py),自然报错。

备注:内容来源于stack exchange,提问作者Aviator

火山引擎 最新活动