python导入根文件夹并使用所有子文件夹

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

具有以下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.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模块
。顺便说一句,这是我的。导入*
对我不起作用