2017-09-15 67 views
3

用下面的目錄結構蟒蛇進口根文件夾,並使用所有子文件夾

. 
├── 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() 

其中some_module內容是

def bar(): print('bar') 

其中more_modules的內容是

def foo(): print('foo') 

我似乎無法得到這個工作

編輯:我會得到在第一種情況下的錯誤是

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
AttributeError: module 'yourpackage' has no attribute 'some_module' 

在第二種情況下,這是一個類似的錯誤,但與more_modules

+0

從哪個文件運行代碼? –

+0

從根的python解釋器。我首先執行'pip install -e。' – shadi

+0

請提及您在問題中獲得的錯誤 –

回答

0

堆在@ A.Joly和@slallum的答案:其實,我發現他們的方法結合實際工作。我創建這些:

內容的
pycharmprojects 
    |_networkxy 
     |_ main_run.py ---- misleading name, it's just an ordinary file 
     |_ more_module.py 
     |_ __init__.py 

__init__.py

內容的 main_run.py
from . import main_run 
from . import more_module 

內容的 more_module.py
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 

注:由於某些原因,我不能做import main_run__init__.py,但from . import *似乎工作。

+0

謝謝!所有這一次,我失蹤的是'來自'。導入some_module'。順便說一句。導入*'沒有爲我工作 – shadi

0

進口實際上相當棘手......

你可以做如下:

import yourpackage as yp 
from yourpackage import some_module #yp does not work 

呼叫IPython中:

In [8]: yp.some_module.bar() 
bar 

然後在IPython中

import yourpackage.sub_package 
from yourpackage.sub_package import more_modules 

電話:

In [20]: yp.sub_package.more_modules.foo() 
foo 

你不得不進口頂級包,那麼子包...

這裏有一個有趣的聯繫:https://www.codementor.io/sheena/python-path-virtualenv-import-for-beginners-du107r3o1

而這一次,以及:):https://docs.python.org/2/tutorial/modules.html

+0

,所以如果不明確地調用''from yourpackage import some_module''就不能工作? – shadi

+0

是的,除非你這樣做:從你的軟件包導入*,這是最糟糕的事情。雖然我沒有嘗試過,但我不確定它是否適用於子包裝。 –

1

如果你想使用內部模塊,而輸入他們明確你必須輸入他們在__init__.py文件:

import some_module 
import other_module 
import sub_package 

sub_package/__init__.py

import more_modules 

無這可能會導致模塊的第一次導入變慢。

其他選項是明確地將它們導入您的代碼:

>> import yourpackage.some_module 
>> import yourpackage.sub_package.more_modules 
>> yourpackage.some_module.bar() 
>> yourpackage.sub_package.more_modules.foo() 
+0

當我在'__init __。py'中使用'import some_module'時,出現錯誤'ImportError:No module named'some_module'' – shadi

相關問題