我的 python 代码在一个名为“project”的文件夹中,所以我的代码文件在 project/*.py 中。我想在其中包含子模块,例如
project/code.py # where code lives
project/mymodule1 # where more code lives
project/mymodule2
每个模块目录都有自己的init .py 文件,例如
project/mymodule1/__init__.py
假设我在 mymodule1 (project/mymodule1/test.py) 中有一个文件“test.py”,我想从“code”中引用一些东西,例如导入函数“myfunc”
== project/mymodule1/test.py ==
from code import myfunc
问题是除非用户将“project/”目录放在他们的 PYTHONPATH 中,否则找不到“code”。有没有办法避免这种情况并使用某种“相对路径”来导入 myfunc,例如
from ../code import myfunc
基本上,我不想强迫代码的用户更改 PYTHONPATH,除非我可以在我的脚本中以编程方式为他们执行此操作。我希望它开箱即用。
如何才能做到这一点?任何一种解决方案都很好:以编程方式更改 PYTHONPATH,或者更理想的是,使用某种相对导入来引用“代码”,因为即使我不知道“project/code.py”在用户计算机上的位置,我也知道在哪里它是相对于“myfunc”的。
编辑:有人可以显示包内导入的正确示例吗?我试过,从“mymodule1”做:
from .. import foo
其中“foo”在 code.py 中,但它不起作用。我在 mymodule1 中有init .py,所以:
project/code.py
project/mymodule1/__init__.py
project/mymodule1/module1_code.py
其中 module1_code.py 尝试导入 foo,这是在“code.py”中定义的函数。
编辑:我仍然存在的主要困惑是,即使在采用了响应我的消息时给出的示例,显示了 project/sub1/test 层次结构,您仍然不能“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
如何解决?
谢谢。