我在一个名为“project”的文件夹中有我的python代码,所以我的代码文件在project/* .py中。我想在其中有子模块,例如pythonic模块组织 - 如何引用根目录中的文件?
project/code.py # where code lives
project/mymodule1 # where more code lives
project/mymodule2
每个模块目录有它自己的初始化 .py文件,例如
project/mymodule1/__init__.py
假设我有mymodule1(项目/ mymodule1/test.py)内的文件“test.py”,我想指的是从“代码”的东西,例如导入功能“MYFUNC”
== project/mymodule1/test.py ==
from code import myfunc
的问题是,“代码”不会被发现,除非用户已经放置了“项目/”目录中的PYTHONPATH。有没有办法避免这种情况,并使用某种“相对路径”来导入myfunc,例如
from ../code import myfunc
基本上,我不想强迫代码的用户修改PYTHONPATH,除非我可以从我的脚本中以编程方式为他们做。我希望它可以开箱即用。
这怎么办?任何解决方案都是很好的:以编程方式更改PYTHONPATH,或者更理想的是,使用某种相对导入来引用“代码”,因为即使我不知道“project/code.py”在用户计算机上的位置,我知道在哪里它相对于“myfunc”。
编辑:有人可以显示内部包导入适当的例子吗?我想,从“mymodule1”做:
from .. import foo
其中“富”是code.py,但它不工作。我在mymodule1 初始化的.py,所以:
project/code.py
project/mymodule1/__init__.py
project/mymodule1/module1_code.py
其中module1_code.py尝试导入FOO,在 “code.py” 中定义的函数。
编辑:我仍然存在的主要困惑是,即使采用了响应我的消息给出的示例,显示项目/ sub1 /测试层次结构,您仍然不能“cd”到sub1中并执行“python test.py “并让它工作。用户必须在包含“project”的目录中并执行“import project.sub1.test”。无论用户在哪个目录下,我都希望这样工作。在这种情况下,用户必须执行位于project/sub1 /中的文件“test.py”。因此,测试案例是:
$ cd project/sub1
$ python test.py
其产生错误:
ValueError: Attempted relative import in non-package
这可怎么固定?
感谢。
'code.py'是否也导入'mymodule1/test.py'?如果是这样,你会想要重新组织你的代码。如果可能的话,应避免循环进口。 – Wilduck