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