我是否需要将项目目录添加到每个脚本中的系统路径以从另一个目录导入函数?

bla*_*lah 10 python

我正在努力保持数据科学项目组织良好,所以我在我的src目录中创建了一个目录,其中包含utils一个名为的文件helpers.py,其中包含一些将在许多脚本中使用的辅助函数.我应该如何func_namesrc/utils/helpers.py一个完全不同的目录中导入文件的最佳实践是什么,例如src/processing/clean_data.py

我看到了这个问题的答案,我已经实现了一个有效的解决方案,但这感觉很难看:

 sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))))
Run Code Online (Sandbox Code Playgroud)

我这样做了吗?我是否需要将此添加到每个要导入的脚本中func_name,例如train_model.py

我当前的项目文件夹结构:

myproject
    /notebooks
        notebook.ipynb
    /src
        /processing
            clean_data.py
        /utils
            helpers.py
        /models
            train_model.py
        __init__.py
Run Code Online (Sandbox Code Playgroud)

示例文件:

# clean_data.py

import os
import sys

sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))))
from src.utils.helpers import func_name

func_name()


# helpers.py

def func_name():
    print('I'm a helper function.')
Run Code Online (Sandbox Code Playgroud)

Sus*_*ary 8

首先,让我向您描述Python 模块Python 包之间的区别,以便我们在同一页面上。?


模块是在一次导入下导入并使用的单个 .py 文件(或多个文件)。?

import aModuleName # Here 'aModuleName' is just a regular .py file.

而包是目录中提供包层次结构的模块集合。一个包包含一个不同的__init__.py文件。?

from aPackageName import aModuleName # Here 'aPackageName` is a folder with a `__init__.py` file # and 'aModuleName', which is just a regular .py file.


因此,当我们有一个名为proj-dir的以下结构的项目目录时?

proj-dir --|--__init__.py --package1 --|--__init__.py --|--module1.py --package2 --|--__init__.py --|--module2.py

请注意,我还在proj-dir本身中添加了一个空__init__.py的,这也使它成为一个包。

现在,如果你想导入任何Python对象模块2包装2模块1包1,然后导入在文件中的语句module1.py

from package2.module2 import object2 # if you were to import the entire module2 then, from package2 import module2

我希望这个简单的解释能澄清您对 Python 导入机制的疑虑并解决问题。如果没有,请在此处发表评论。


Vik*_*ote 7

做正确的方法是使用__init__.py,setup.pysetuptoolsPython包:

myPackage/
    myPackage/
        __init__.py
    setup.py
Run Code Online (Sandbox Code Playgroud)

链接包含所有步骤.