Python中解决import路径问题的详细指南:如何正确使用__init__.py文件

如果文件不在同一路径下,导入会比较麻烦。您需要在导入文件的路径下创建一个新的 __init__.py 文件。只需创建它,无需向其中添加内容。

Python中解决import路径问题的详细指南:如何正确使用__init__.py文件

比如导入文件的路径是...A/b.py,那么只需要在A文件夹下新建一个__init__.py文件,然后按照下面的语句引用即可:

import A.b

进一步解释

文件结构现在看起来像这样

root
|
|--A文件夹
|    |--main.py
|
|--B文件夹
     |--b.py

现在主程序在A文件夹中,我想调用B文件夹中的b.py文件,该怎么办?

本来我以为只需要在a.py中写:

sys.path.append('../B')
import b as bb

但它实际上会报告一个错误,说 No module named 'b'

附注这种直接添加相对路径的方法在Jupyter中不会报错。我不知道为什么。

其实这时候如果你用sys.path去查看路径,你会发现确实已经添加了,只不过是相对路径。因此,添加路径时,相对路径的引用地址不是当前文件,而是python根目录。

这个问题有3种解决方案:

1.添加绝对路径

sys.path.append('/home/gxp/Documents/B')

2、通过拼接路径添加绝对路径(与1基本相同)

sys.path.append(os.path.join(os.path.dirname(__file__),'../B'))

这里join连接两个路径,__file__代表当前文件,dirname返回文件夹的绝对路径。所以这里添加的路径本质上是'/home/gxp/Documents/A/../B',即sys.path.append('/home/gxp/Documents/B')和sys.path。 append('/home/gxp/Documents/A/../B') 的效果是一样的。

3.使用相对引用或其他方法

这种方法存在很多问题,其中一些问题最终没有被完全理解。

这个方法看上去和上面提到的创建__init__.py文件的方法是一样的,但是这里发现,不添加这个文件似乎也能正常运行。

考虑以下文档结构。主程序是b1.py或main.py。

如果是main.py,那就容易多了,因为它在根目录下,直接import Bb就可以了。

但如果是b1.py,则可以使用相对导入。您可以参考Python中的绝对引用与相对引用一文以获得全面的解释。然而,当你使用它时,你会得到一个错误。就像下面的方法一样,不会正常运行。错误消息显示 ImportError:尝试在没有已知父包的情况下进行相对导入。

这似乎是一个很常见的问题,但似乎没有通用的解决方案。

可以参考Stackoverflow上的文章:

看起来Pycharm中间接引用不会有问题,所以可能是VSCode的原因?

但无论如何,间接引用并不是一个非常推荐的方法。就像全局变量一样,当它很大时很容易把程序搞乱。

尤其是如果各个子文件夹中的模块还互相调用的话,写起来就真的很乱了。

如果一定要解决的话,上面第二篇 Stack Overflow 文章里有解决方案。

import sys
from pathlib import Path
sys.path[0] = str(Path(sys.path[0]).parent.parent)  
# 将工作目录改为项目根目录,这里每一个.parent就是向上翻一级,sys.path[0]就是当前目录
from B.B1 import b2 as b2
b2.b2()

这样,虽然主程序在子文件夹中,但工作目录是根目录。所以可以像main.py一样通过B.B1解决。不过这种情况下,如果各个子文件夹中的模块互相调用的话,导入时都需要设置,虽然有点麻烦,但也不是不可能。

所以经过千辛万苦,更好的解决方案仍然是:

1、主程序不要放在子文件夹中,放在根目录下,然后使用import B.B1.b2。

2.如果主程序放在子文件夹中,一种解决方案是添加路径。这种方案的优点是复用性好,缺点是没有模块不识别的自动提示和警告;另一种解决方案是将工作目录更改为根目录。这种方案的优点是有自动提示,写起来舒服。缺点是如果各个子文件夹的内存互相调用,会影响复用性。 (我还是更喜欢第二种,大多数人的程序其实都是在子文件夹里有相互调用的模块,其实问题也不大)

运行另一个 .py 文件

参考文章

在同一目录下

import os
os.system("python filename.py")

在不同的目录下

如果按照上面的方法,会报错

错误 sh: /Users//Desktop/.py: 权限被拒绝

正确的方法是

import os
os.system('{} {}'.format('python',loc))
# 或者是
os.system('python {}'.format(loc))

这里的loc是一个字符串,使用相对路径即可。

但是这样无法输出运行文件得到的变量。如果想输出结果并进行进一步的操作,可以参考文章。使用的方法是

# 所采用的方法如下
# from 变量所在文件名 import 变量名
import os
# os.system('{} {}'.format('python','A/main.py'))
os.system('python {}'.format('A/main.py'))
from A.main import c  # 如果在同一目录下则直接 from main import c 即可
d = c+1
print('d=',d)

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

30阅读

外国教程python,python编程教学视频

2026年09月02日

24阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

26阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读