想象一下这个目录结构:
app/
__init__.py
sub1/
__init__.py
mod1.py
sub2/
__init__.py
mod2.py
Run Code Online (Sandbox Code Playgroud)
我正在编码mod1,我需要从中导入一些东西mod2.我该怎么办?
我尝试了from ..sub2 import mod2但是我得到了"尝试非包装中的相对导入".
我google了一下,但发现只有" sys.path操纵"黑客.有没有干净的方式?
编辑:我__init__.py的所有人目前都是空的
EDIT2:我想这样做,因为SUB2包含了为子包(共享类sub1,subX等等).
Edit3:我正在寻找的行为与PEP 366中描述的相同(感谢John B)
目前正在尝试使用Python3并使用绝对导入将一个模块导入另一个模块但我收到错误ModuleNotFoundError: No module named '__main__.moduleB'; '__main__' is not a package.考虑这个项目结构:
proj
__init__.py3 (empty)
moduleA.py3
moduleB.py3
Run Code Online (Sandbox Code Playgroud)
moduleA.py3
from .moduleB import ModuleB
ModuleB.hello()
Run Code Online (Sandbox Code Playgroud)
moduleB.py3
class ModuleB:
def hello():
print("hello world")
Run Code Online (Sandbox Code Playgroud)
然后运行python3 moduleA.py3给出错误.这里有什么需要改变的?
谢谢!
已经 有人对此主题提出疑问。有时程序员会__init__.py在某些地方放置一些路径,通常有人说应该使用绝对路径。但是,我无法让它在这里工作:
如何从包中导入类以便 pytest 中的测试运行并可以使用代码?
\n目前我得到 pytest 或通过各自运行的代码。
\n我的示例项目结构是
\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 testingonly\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cli.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 testingonly.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_testingonly.py\nRun Code Online (Sandbox Code Playgroud)\n__init__.py在这两种情况下都是空文件。
$ cat testingonly/cli.py\n"""Console script for testingonly."""\nfrom testingonly import Tester\n\ndef main(args=None):\n """Console script for testingonly."""\n te = Tester()\n return 0\n\nmain()\nRun Code Online (Sandbox Code Playgroud)\n$ cat testingonly/testingonly.py\n"""Main module."""\nclass Tester():\n def __init__(self):\n print("Hello")\nRun Code Online (Sandbox Code Playgroud)\n正如预期的那样:
\n$ python3 testingonly/cli.py\nHello\nRun Code Online (Sandbox Code Playgroud)\n然而,尝试测试这一点失败了:
\n$ pytest\n========================================================= test session starts =========================================================\nplatform linux -- …Run Code Online (Sandbox Code Playgroud) 我在Windows 10上使用Python 3.6.我在同一目录中有2个.py文件char.py,并且char_user.py,如下所示:
char.py:
# char.py
import cv2
#######################################################################################################################
class Char:
# constructor #####################################################################################################
def __init__(self):
self.contour = None
self.centerOfMassX = None
self.centerOfMassY = None
# end def
# end class
Run Code Online (Sandbox Code Playgroud)
char_user.py:
# char_user.py
import os
import cv2
# I've tried this various ways, see more comments below
from .char import Char
#######################################################################################################################
def main():
char = Char()
char.centerOfMassX = 0
char.centerOfMassY = 0
print("finished main() without error")
# end main
#######################################################################################################################
if __name__ == "__main__": …Run Code Online (Sandbox Code Playgroud) 如果我执行main.py正常,问题出在我执行时demo2.py
|myPackage
|subPackage
demo.py
demo2.py
main.py
Run Code Online (Sandbox Code Playgroud)
main.py
from ludikDriver.demo2 import demo2_print
demo2_print()
Run Code Online (Sandbox Code Playgroud)
demo2.py
from .demo import demoprint
def demo2_print():
print("demo2")
demoprint()
demo2_print()
Run Code Online (Sandbox Code Playgroud)
演示
def demoprint():
print("demo")
Run Code Online (Sandbox Code Playgroud)
错误: from .demo import demoprint
ModuleNotFoundError: No module named '__main__.demo'; '__main__' is not a package
Run Code Online (Sandbox Code Playgroud)
我应该有__init__.py吗?