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

Python从__main__导入address触发ImportError,求排查解决方法

解决 ImportError: cannot import name 'address' from '__main__' 问题

问题根源分析

你的问题出在两个核心点上:

  1. if __name__ == "__main__" 的执行时机:你在__main__.py里把address定义在了这个入口保护块里,只有当你**直接运行__main__.py**时,这个代码块才会执行。但当config.py尝试从__main__导入address时,__main__模块的上下文已经变了——要么是config.py导入时__main__.py的入口块还没执行,要么是测试框架运行时把测试文件当成了__main__,导致找不到你定义的address。
  2. __main__模块的上下文混淆:测试框架(比如pytest)运行测试时,会把测试脚本(比如test_scenario_01.py)作为__main__模块,这时候from __main__ import address会去测试文件里找变量,而不是你启动的那个__main__.py。

推荐解决方案

方案1:用环境变量传递地址(最稳定的方案)

这种方法完全避开了模块导入的上下文问题,适合跨模块传递配置:

  • 修改__main__.py,把地址存入环境变量:
import sys
import os
from tests.test_suite import runner

if __name__ == "__main__":
    address = str(sys.argv[1])
    os.environ["TEST_TARGET_ADDRESS"] = address  # 写入环境变量
    runner()
  • 修改config/config.py,读取环境变量并设置默认值:
import os

# 读取环境变量,没设置的话用默认值127.0.0.1
target_address = os.getenv("TEST_TARGET_ADDRESS", "127.0.0.1")
EXAMPLE_URL = f"http://{target_address}/login"

方案2:重构参数传递逻辑,直接把地址传给测试运行器

把地址作为参数传递给测试运行器,再同步到配置模块:

  • 修改__main__.py,传递地址给runner:
import sys
from tests.test_suite import runner

if __name__ == "__main__":
    address = str(sys.argv[1])
    runner(target_address=address)
  • 修改tests/test_suite.py的runner函数,更新配置:
def runner(target_address):
    # 导入配置模块并更新地址
    import config.config as app_config
    app_config.EXAMPLE_URL = f"http://{target_address}/login"
    
    # 执行你的测试逻辑
    # ...

方案3:用单独的参数模块存储配置

创建一个专门的参数模块,避免依赖__main__:

  • 在config/目录下新建params.py:
# 初始化一个空的地址变量
target_address = None
  • 修改__main__.py,给参数模块赋值:
import sys
from config.params import params
from tests.test_suite import runner

if __name__ == "__main__":
    params.target_address = str(sys.argv[1])
    runner()
  • 修改config/config.py,从参数模块导入:
from config.params import params

# 确保参数已设置,或者加个默认值
assert params.target_address is not None, "Target address not set!"
EXAMPLE_URL = f"http://{params.target_address}/login"

总结

从__main__导入变量是非常脆弱的,因为__main__的上下文会随着执行入口变化而改变。上面的三种方案都能解决你的问题,其中环境变量方案最通用,适合大多数测试场景;如果需要更严格的类型控制或参数校验,可以选择方案3的参数模块。

内容的提问来源于stack exchange,提问作者Gergan Zhekov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:08:47