Python:不带包或模块的相对导入

Python:不带包或模块的相对导入,python,python-2.7,Python,Python 2.7,在尝试处理相对导入并阅读了许多关于它的StackOverflow帖子之后,我开始意识到这比它需要的复杂得多 除了我,没有其他人在使用此代码。我没有创建工具或api,因此我认为没有必要创建“包”或“模块”。我只想将代码组织到文件夹中,而不是将50个脚本都放在同一个目录中。这太可笑了 基本上,我只想有三个文件夹,并且能够从任何我想要的地方导入脚本。一个文件夹,其中包含一些具有实用程序功能的脚本。另一个文件夹包含大部分代码,另一个文件夹包含一些实验(我正在做机器学习研究) 我所需要做的就是在文件夹之间

在尝试处理相对导入并阅读了许多关于它的StackOverflow帖子之后,我开始意识到这比它需要的复杂得多

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

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

我所需要做的就是在文件夹之间导入python文件

我找到的一个解决方案是将
\uuuu init\uuuu.py
文件放在每个目录中,包括文件夹所在的根目录。但是我需要在该目录的父目录中运行我的实验

/experiment1.py
/experiment2.py
/project/__init__.py
/project/code/__init__.py
/project/utils/__init__.py
因此,上述方法是有效的。但是我有两个问题。我的实验与代码不在同一文件夹中。这很烦人,但我想我可以接受。但更大的问题是,我不能将我的实验放在不同的文件夹中:

/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运行我的实验,这对我来说很奇怪

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

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(\uu文件\uu)
出错了

肯定有人在我的位置上试图将他们的python脚本组织在文件夹中,而不是将它们全部放在一个目录中


对于这个问题,有没有一个好的、简单的解决方案,或者我必须求助于上述方法之一?

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

/project/experiments
/project/code
/project/utils
/project/main.py
main.py
文件上调用您的实验,并在
main.py
文件上进行导入。
\uuuu init\uuuu.py
s也应位于每个文件夹中

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

所以我发现教程非常有用

我提出的解决办法如下:

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 develope
,以便将我的代码进行符号链接,以便我可以将其导入其他任何地方(您可以取消与
python setup.py develope的链接--卸载


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

只要添加到pythonpath并使用import?不管其他人是否会使用您的代码,这都不应该阻止您以正确的方式进行操作。@Inault同意。那么正确的方法是什么呢?一种方法是在开发模式下使用
setuptools
。我很抱歉,但是我很快就迷路了。。。我甚至没有
setup.py
文件。老实说,除了
pip安装
,我对创建分发包一无所知。这是个好主意。我甚至可以从experiments.experiment1导入*
,然后运行
python-I main.py
并获取所有变量@Inauld提到了“正确的方法”,所以我等着看他怎么说。。。
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