在尝试处理相关导入并阅读有关它的许多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脚本而不是将它们全部放在目录中。
这个问题是否有一个好的,简单的解决方案,或者我是否必须采用上述方法之一?
答案 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
的链接)。
我还没决定是否喜欢我的实验住在项目文件夹内或外面。我认为这不重要,因为这段代码仅供我个人使用。但我想它住在外面是合适的......