python导入根文件夹并使用所有子文件夹
具有以下dir结构python导入根文件夹并使用所有子文件夹,python,import,Python,Import,具有以下dir结构 . ├── setup.py └── yourpackage ├── __init__.py ├── some_module.py ├── other_module.py └── sub_package ├── __init__.py └── more_modules.py 是否可以这样做: >> import yourpackage as yp >> yp.some_module.ba
.
├── setup.py
└── yourpackage
├── __init__.py
├── some_module.py
├── other_module.py
└── sub_package
├── __init__.py
└── more_modules.py
是否可以这样做:
>> import yourpackage as yp
>> yp.some_module.bar()
>> yp.sub_package.more_modules.foo()
其中某些模块的内容是
def bar(): print('bar')
def foo(): print('foo')
其中更多模块的内容是
def bar(): print('bar')
def foo(): print('foo')
我好像没法让它工作
编辑:在第一种情况下我会得到的错误是
Traceback (most recent call last):
File "<string>", line 1, in <module>
AttributeError: module 'yourpackage' has no attribute 'some_module'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:模块“yourpackage”没有属性“some_模块”
在第二种情况下,这是一个类似的错误,但对于更多的\u模块
导入实际上相当棘手
你可以这样做:
import yourpackage as yp
from yourpackage import some_module #yp does not work
呼叫ipython:
In [8]: yp.some_module.bar()
bar
In [20]: yp.sub_package.more_modules.foo()
foo
然后
呼叫ipython:
In [8]: yp.some_module.bar()
bar
In [20]: yp.sub_package.more_modules.foo()
foo
您必须先导入顶级包,然后再导入子包
这里有一个有趣的链接:
还有这个:):如果要使用内部模块而不显式导入它们,则必须在\uuu init\uuuu.py
文件中导入它们:
import some_module
import other_module
import sub_package
在sub_package/\uuuu init\uuuu.py
中:
import more_modules
from . import main_run
from . import more_module
def some_module():
print('some module')
def more_module():
print('more module')
请注意,这可能会使模块的第一次导入变慢
其他选项是在代码中显式导入它们:
>> import yourpackage.some_module
>> import yourpackage.sub_package.more_modules
>> yourpackage.some_module.bar()
>> yourpackage.sub_package.more_modules.foo()
把@A.Joly和@slallum的答案堆起来:事实上,我发现他们的方法结合起来确实有效。我创造了这些:
pycharmprojects
|_networkxy
|_ main_run.py ---- misleading name, it's just an ordinary file
|_ more_module.py
|_ __init__.py
\uuuu init\uuuuu.py的内容
:
import more_modules
from . import main_run
from . import more_module
def some_module():
print('some module')
def more_module():
print('more module')
main\u run.py的内容
:
import more_modules
from . import main_run
from . import more_module
def some_module():
print('some module')
def more_module():
print('more module')
more\u module.py的内容
:
import more_modules
from . import main_run
from . import more_module
def some_module():
print('some module')
def more_module():
print('more module')
现在,在命令行中的目录pycharmprojects
:
(C:\Users\Name\.conda\envs\my_root) C:\Users\Name\PycharmProjects>python
Python 3.6.0 |Anaconda custom (64-bit)| (default, Dec 23 2016, 11:57:41) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import networkxy
>>> networkxy.main_run.some_module()
some module
>>> networkxy.more_module.more_module()
more module
注意:由于某些原因,我无法在\uuuu init\uuuuu.py
中执行import main\u run
,但是来自的。导入*
似乎可以工作。从哪个文件运行代码?从根目录下的python解释器。我进行了pip安装-e。
首先请说明问题中出现的错误添加了错误消息您的\uuuu init\uuuuuuuuuuuuuuuuuupy
文件是否包含对某些模块的导入
?当我在中使用导入某些模块
时,我得到了错误ImportError:没有名为'some_module'的模块
,因此如果不从包中显式调用,导入some_module
,它将无法工作?是的,除非您这样做:从包导入*,这是最糟糕的操作。虽然我没有在这里尝试过,但我不确定它是否适用于子包。谢谢!在这段时间里,我所缺少的是。导入一些\u模块
。顺便说一句,这是我的。导入*
对我不起作用