关于Python中如何正确import自己编写的模块文件
请教一下关于 import 自己的文件的问题
我的目录是这样的
- LogAnalysis
- common
- init.py
- log_factory.py
- test
- common
我希望在 test.py 文件中 import common 中的 log_factory 中的 Log 类,但是在 linux 中执行后发现会报错,提示我 No module named log_factory,不知道是哪里写的有问题……
关于Python中如何正确import自己编写的模块文件
你可以用
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__被转义成斜体的 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 了
竟然真的可以……虽然不知道为什么可以……

