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

时间:2014-11-11 06:54:17

标签: python python-2.7

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

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

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

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

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

我找到的一个解决方案是在每个目录中放置__init__.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.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脚本而不是将它们全部放在目录中。

这个问题是否有一个好的,简单的解决方案,或者我是否必须采用上述方法之一?

2 个答案:

答案 0 :(得分:2)

将python文件作为模块运行对我来说似乎也很奇怪。您可以通过在根目录中放置main.py文件将实验放在文件夹中。所以文件夹树将是以下内容;

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

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

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

答案 1 :(得分:0)

所以我发现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的链接)。

我还没决定是否喜欢我的实验住在项目文件夹内或外面。我认为这不重要,因为这段代码仅供我个人使用。但我想它住在外面是合适的......