Python模块导入时出现sys.path和os.path问题

Python模块导入时出现sys.path和os.path问题,python,python-import,Python,Python Import,我花了一些时间研究这个问题,但我无法在头脑中解决这个问题 我在自己的目录home/program/core/main.py中运行一个程序 在main.py中,我尝试导入一个名为my_module.py的模块,该模块位于不同的目录中,比如home/program/modules/my_module.py 在main.py中,这是我附加到sys.path的方式,因此程序可以在任何人的机器上运行(希望如此) 一切都很好。但这并不理想,因为它现在取决于程序必须存在于home/program下这一事实。这

我花了一些时间研究这个问题,但我无法在头脑中解决这个问题

我在自己的目录home/program/core/main.py中运行一个程序

在main.py中,我尝试导入一个名为my_module.py的模块,该模块位于不同的目录中,比如home/program/modules/my_module.py

在main.py中,这是我附加到sys.path的方式,因此程序可以在任何人的机器上运行(希望如此)


一切都很好。但这并不理想,因为它现在取决于程序必须存在于home/program下这一事实。

这是因为
模块
不是有效的python包,可能是因为它不包含任何
\uu init\uuuuuuuuuuuy.py
文件(如果不使用
\uuuu init\uuuuu.py标记目录,则无法使用
import
遍历目录)

因此,要么添加一个空的
\uuuu init\uuuuu.py
文件,要么只添加
模块的路径
,这样您的第一个代码片段就相当于第二个代码片段:

sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__), '..','modules'))
import my_module

请注意,您也可以通过使用高级导入功能提供模块的完整路径来导入模块:

尽管可以找到答案,但为了方便和完整,这里有一个快速解决方案:

导入导入库
dirname,basename=os.path.split(pyfilepath)#pyfilepath:/my/path/mymodule.py
sys.path.append(dirname)#只应将目录添加到PYTHONPATH
module_name=os.path.splitext(basename)[0]#/my/path/mymodule.py-->mymodule
module=importlib.import_module(module_name)#已定义模块的名称空间(否则我们将逐字查找“module_name”)
现在可以直接使用导入模块的名称空间,如下所示:

a = module.myvar
b = module.myfunc(a)

但这就是我的问题,为什么我应该有无意义的init.py文件?我只希望我的_module.py所在的目录是干净的,我的_module.py实际上是该目录中唯一的文件。为什么
sys.path.append('home/programs/modules'))
不使用
\uuu init\uuuuuuuuuuupy.py
文件工作,因为python就是这样工作的。如果不使用
\uuu init\uuuuuuuuupy.py
标记目录,则无法使用
导入
遍历目录,这并不是毫无意义的。您仍然有第二个解决方案:将路径追加到“模块”.好的,但是我到底如何实现一个代码,在其中我可以导入一个模块,这样程序就可以在用户运行它的任何目录下运行,而不需要init.py,方法是将路径追加到模块目录。否则,您不能这样做。或者使用
importlib
,请参阅我的编辑
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__), '..','modules'))
import my_module
a = module.myvar
b = module.myfunc(a)