Python:没有包或模块的相对导入

2024-05-19 01:47:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在试着处理相关的进口和阅读了许多关于它的StackOverflow的帖子后,我开始意识到这比它需要的复杂得多。在

除了我没人用这个代码。我没有创建工具或api,所以我认为没有必要创建“包”或“模块”。我只想将代码组织到文件夹中,而不是将50个脚本都放在同一个目录中。太荒谬了。在

基本上,只想有三个文件夹,并能够导入脚本从任何地方我想。一个文件夹,其中包含一些具有实用功能的脚本。另一个文件夹包含大部分代码,另一个文件夹包含一些实验(我正在进行机器学习研究)。在

/project/code/
/project/utils/
/project/experiments/

我只需要在文件夹之间导入python文件。在

我发现的一个解决方案是将__init__.py文件放入每个目录,包括文件夹所在的根目录。但是我需要在这个目录的父目录中运行我的实验。在

^{pr2}$

所以上面的工作。但是我有两个问题。我的实验和代码不在同一个文件夹中。这很烦人,但我想我能忍受。但更大的问题是我不能把我的实验放在不同的文件夹里:

/experiments/experiment1/something.py
/experiments/experiment2/something_else.py
/project/__init__.py
/project/code/__init__.py
/project/utils/__init__.py

我想我可以将项目目录符号链接到每个实验文件夹中,但这太荒谬了。在

另一种方法是把一切都当作一个模块来处理:

/project/__init__.py
/project/code/__init__.py
/project/utils/__init__.py
/project/experiments/__init__.py
/project/experiments/experiment1/something.py
/project/experiments/experiment2/something_else.py

但是我必须用python -m project.experiments.experiment1.something来做实验,这对我来说很奇怪。在

到目前为止,我找到的解决方案是:

import imp
import os
currentDir = os.path.dirname(__file__)
filename = os.path.join(currentDir, '../../utils/helpful.py')
helpful = imp.load_source('helpful',filename)

这是可行的,但它是乏味和丑陋的。我尝试创建一个脚本来处理这个问题,但是os.path.dirname(__file__)是错误的。在

当然,有人在我的位置上试图将他们的python脚本组织到文件夹中,而不是把它们都放在一个目录中。在

这个问题有没有一个好的、简单的解决方案,或者我将不得不求助于上面的一个?在


Tags: path代码py目录project脚本文件夹init
2条回答

所以我发现this教程非常有用。在

我提出的解决方案如下:

project/
    .gitignore
    setup.py
    README.rst
    MANIFEST.in
    code/
        __init__.py
        something.py
        tests/
            __init__.py
            tests.py
        utils/
            __init__.py
            utils.py
    experiments/
        experiment1/
            data.json
            experiment1.py
        experiment2/
            data.json
            experiment2.py

然后我运行python setup.py develop以符号链接我的代码,这样我就可以将它导入到任何其他地方(你可以取消与python setup.py develop uninstall的链接)。在

我还没有决定我的实验是在项目文件夹里还是在外面。我不认为这真的很重要,因为这段代码只供我个人使用。但我想它应该住在外面。。。在

将python文件作为模块运行对我来说也很奇怪。通过在根目录下放一个main.py文件,您可以将您的实验放在一个文件夹中。因此文件夹树如下所示:

/project/experiments
/project/code
/project/utils
/project/main.py

main.py文件上调用实验,并在main.py文件上进行导入。__init__.py也应该在每个文件夹中。在

这样,就不需要将py文件作为python模块运行。此外,项目将有一个单一的入口点,这在许多情况下非常有用。在

相关问题 更多 >

    热门问题