Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“中的项目可以是什么?”;进口项目“;用python?_Python_Import - Fatal编程技术网

“中的项目可以是什么?”;进口项目“;用python?

“中的项目可以是什么?”;进口项目“;用python?,python,import,Python,Import,我有以下层次结构 A\ B\ __init__.py testB.py C\ __init__.py test1.py test2.py 当我在testB.py中编写以下内容时 import C test1.func1() test2.func2() 为什么我无法调用test1.py或test2.py中定义的函数 注意:test1.py和test2.py中分别定义了一个名为func1和func2的函数。您可能会以C的方式考虑Py

我有以下层次结构

A\
  B\
    __init__.py
    testB.py
    C\
      __init__.py
      test1.py
      test2.py
当我在testB.py中编写以下内容时

import C
test1.func1()
test2.func2()
为什么我无法调用test1.py或test2.py中定义的函数


注意:test1.py和test2.py中分别定义了一个名为func1和func2的函数。

您可能会以C的方式考虑Python导入。但是Python导入的工作方式如下:

import C.test1
import C.test2
C.test1.func1()
C.test2.func2()


当您导入C时,Python导入机制不会查看您的
C
目录并自动从该目录导入每个“.py”文件。这节省了内存和时间——假设目录
C
是一个巨大的包;它不会优化内存空间来导入所有内容

相反,请执行以下操作:

from C import test1, test2

test1.func1()
test2.func2()

第一个选项:您可以添加一个

从test1导入*
从test2导入*

从test1导入func1
从test2导入func2
(第二个选项显然更好,
from…import*
不是一个好的样式。)

\uuuu init\uuuu
文件的顶部,然后您可以执行以下操作

导入C
C.职能1()
C.2()
模块并不是全部加载的,而是存储在“变量”C中

这是第二个选择:

将此项添加到
\uuuuu init\uuuuuuuuuuy.py

导入测试1 导入测试2 并以这种方式使用它:

从C导入*
test1.func1()
test2.func2()
或者第三种选择:

更改
\uuuu init\uuuuu.py
就像您对选项2所做的那样

利用它

从C导入test1、test2
test1.func1()
test2.func2()

第三种选择优于第二种选择;作为来自。。。导入*不是一种好的风格。

你的C?Thomas Junk@的uuuuuuuuuuuuuuuy.py中有什么?它的空文件你不能从C导入test1、test2进行
吗?@jDo我可以这样做,但我想知道为什么上面的代码不起作用?那么这意味着我们不能直接导入子包吗?
从C导入test1
是一个“直接的”那么,您的意思是当我执行“导入C”时,它将从C?您的C目录导入所有.py文件。请参阅我的答案以获得更多解释。好的,如果它从C导入所有.py文件,那么为什么我无法使用使用“test1.func1()”在其中定义的函数?否-正确的行为是,
import C
不会从目录C导入所有.py文件。这就是为什么您无法使用这些函数。关于原因的解释,请参见我上面的答案。太好了,那么“导入C”到底是做什么的呢?
from C import test1, test2

test1.func1()
test2.func2()