2016-04-26 219 views
0

我正在创建一些模块GUI(描述图形界面),它需要另一个模块somecalc(进行一些计算)。后者导入标准库:os,sys,time导入其他子模块并忽略标准库

目标是最终构建一个包。

我无法找到关于包装和/或其他自主研发的模块中引入其他子模块的约定:

  1. 不弄乱名字空间(并自动完成在IPython中):

    • 我不希望看到somecalc.ossomecalc.syssomecalc.time
  2. ,而无需重新导入已经进口的somecalc

    • 即使我在somecalc.py书面方式import os as _os解决问题#1标准库,我也做同样的两种方式。如果我做内GUI以下测试:
    • somecalc.os is os #TRUE(在somecalc.pyimport os
    • somecalc._os is os #TRUE(从IPython中没有自动完成与somecalc.pyimport os as _os
  3. 无需繁琐调用标准库,例如当我简单写os.listdir时写somecalc.os.listdir。除此之外,我不认为其他开发人员是否愿意与我一起开展项目。

我知道,一旦我希望把我的文件夹成一个包,我建议增加一个__init__.py文件用我所有的进口。但是当我开发/调试我的子模块时(使用if __name__ = '__main__'以下的代码),根目录中的__init__.py文件将被忽略。除此之外,我还需要在我的GUI.py文件的开头写上import somecalc

什么是约定?

回答

1

在您的__init__.py只暴露您需要暴露的内容。创建其他需要标准库的.py,然后导入你需要的内容。

$ tree GUI/ 
GUI 
├── __init__.py 
└── somecalc 
    ├── __init__.py 
    ├── somecalc.py 

$ cat GUI/__init__.py 
import somecalc 

$ cat GUI/somecalc/__init__.py 
from somecalc import get_time 

$ cat GUI/somecalc/somecalc 
import os 
import sys 
import time 

def get_time(): 
    return time.time() 

这样,当你输入somecalc,你只看到get_timesomecalc子模块:

$ python 
Python 2.7.9 (default, May 20 2015, 15:38:28) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import GUI 
>>> dir(GUI) 
[..., 'somecalc'] 
>>> dir(GUI.somecalc) 
[..., 'get_time', 'somecalc'] 
>>> dir(GUI.somecalc.somecalc) 
[..., 'get_time', 'os', 'sys', 'time'] 
>>> 
+0

您的解决方案并不让我从GUI访问标准库,或在更麻烦方式:现在somecalc.os.listdir成为somecalc.somecalc.os.listdir。 – Wli

+0

使用'import sys'访问标准库?问题是什么 ? – Cyrbil

+0

我不确定,这就是为什么我问大会。 因此,即使模块“x”已经导入到子模块“sm”中,我仍然必须每次导入“x”到所有已导入“sm”的模块中,对吧? 这是我发现奇怪的,因为我从来没有在下载的模块目录下找到标准库。 – Wli