Python中解决import路径问题的详细指南:如何正确使用__init__.py文件
如果文件不在同一路径下,导入会比较麻烦。您需要在导入文件的路径下创建一个新的 __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)