关于Python中如何正确import自己编写的模块文件

请教一下关于 import 自己的文件的问题

我的目录是这样的

我希望在 test.py 文件中 import common 中的 log_factory 中的 Log 类,但是在 linux 中执行后发现会报错,提示我 No module named log_factory,不知道是哪里写的有问题……


关于Python中如何正确import自己编写的模块文件

13 回复

你可以用
python -m test.test 的方法运行 test.py,就能正确运行了…


在Python里import自己写的模块,核心就两点:让解释器能找到你的文件,然后用正确的语法导入。

1. 让Python找到你的模块 这主要靠sys.path,Python会在这个列表里的路径中搜索模块。常见方法有:

  • 同目录导入:最简单。你的脚本和模块文件在同一个文件夹下,直接import module_name就行。
  • 修改sys.path:在脚本开头加sys.path.append('/path/to/your/module'),临时添加路径。适合快速测试,但生产环境不建议。
  • 使用相对导入(在包内):如果你的文件在一个包里(有__init__.py的文件夹),可以用点号。例如在mypackage/submodule.py里想导入同包的another.py,就写from . import another
  • 设置PYTHONPATH环境变量:一劳永逸的方法,把模块所在目录加到这个环境变量里,所有项目都能用。

2. 正确的导入语法

  • 导入整个模块import mymodule,然后用mymodule.function()调用。
  • 导入特定内容from mymodule import myfunction,然后直接myfunction()
  • 给模块起别名import mymodule as mm,防止名字冲突或简化长名字。

举个最常见的例子: 假设你有这样一个项目结构:

my_project/
├── main_script.py
└── my_utils.py

my_utils.py里有个函数:

def greet(name):
    return f"Hello, {name}!"

main_script.py里导入使用:

# 方法1:导入整个模块
import my_utils
print(my_utils.greet("World"))

# 方法2:导入特定函数
from my_utils import greet
print(greet("World"))

直接运行main_script.py就能成功,因为它们在同一目录下。

一个坑:循环导入 避免文件A导入B,同时文件B又导入A,这会让Python懵掉。设计时尽量让依赖关系单向。

总结:确保文件在Python的搜索路径里,语法别写错。

应该是 “init.py” 文件,不是 “init.py

应该是楼主没有```包起来,然后__init__被转义成斜体的 init 了…

请 import common

python import 的问题隔一段时间就会有人提出来:

https://www.google.com.hk/search?q=site:v2ex.com/t%20import&gws_rd=cr,ssl

在 LogAnalysis 为当前工作目录的时候python test/<a target="_blank" href="http://test.py" rel="nofollow noopener">test.py</a>

包的定义问题😂

使用 absolute import. 而且, 没有__init__.py ,是不会构成一个 package 的
from common import log_factory

lz 还是仔细研究下 python 的 import 机制吧

被转义了……我忘记预览了……

import common 是没问题的,但是里面的函数 类都用不了……

有__init__.py 的,发主题的时候被转义了……如果我在 import 的前面先 sys.path.append(…/common),是可以正常 import 的,但是如果我在 test 目录下 sys.path.append(…)到 LogAnalysis 目录下,就不能 import common 里面的 module 了

竟然真的可以……虽然不知道为什么可以……

回到顶部