2015-09-04 28 views
1

我已經寫了從文件中解析數據,然後使用硒輸入數據到網站上的小Python代碼,我試圖用一個腳本來捆綁它。導入在Python包比普通的腳本

我已經可以把它打包成PIP包並上傳,但試圖運行它時,我得到了ImportError: No module named '<name>'在同一目錄模塊。

我的結構非常簡單

chessil_tourney_inserter/ 
    setup.py 
    chessil_tourney_inserter/ 
     __init__.py (empty) 
     chessil_tourney_inserter.py 
     swiss98_text_parser.py 
     command_line.py 

而且setup.py也相當簡單:

from setuptools import setup 

setup(name='chessil_tourney_inserter', 
    . 
    . 
    . 
    packages=['chessil_tourney_inserter'], 
    zip_safe=False, 

    install_requires = [ 
     'selenium' 
    ], 

    entry_points={ 
     'console_scripts': [ 
     'insertchessiltourney = chessil_tourney_inserter.command_line:main'] 
    }) 

截至目前command_line.main簡單地調用chessil_tourney_inserter

import chessil_tourney_inserter.chessil_tourney_inserter as cti 
import sys 

def main(): 
    if len(sys.argv) == 1: 
     print("Usage: chessil_tourney_inserter.py *tournament name*") 
     exit() 
    cti.main(); 

if __name__ == "__main__": 
    main() 

和chessil_tourney_inserter給我一個進口錯誤:

import swiss98_text_parser 

,但如果我嘗試直接運行chessil_tourney_inserter.py它的工作原理,如果我添加了包名的進口將突破chessil_tourney_inserter.py

所以我怎麼設置的文件,使進口量將當我直接運行文件時,以及當我嘗試將它作爲包導入或將其作爲腳本運行時,都能正常工作?

回答

1

在頂部的文件夾添加__init__.py了。

chessil_tourney_inserter/ 
setup.py 
__init__.py 
chessil_tourney_inserter/ 
    __init__.py (empty) 
    chessil_tourney_inserter.py 
    swiss98_text_parser.py 
    command_line.py 

請參閱What is __init__.py for?瞭解更多信息。

+0

這麼簡單,完美的作品。謝謝!我閱讀了__init__.py,但沒有意識到它應該在目錄之外......在我的搜索中,我發現了一些從python 3開始的地方,如果包名稱匹配它將在內部搜索的目錄,即使沒有__init__。 py文件,這是代碼與包名稱一起工作的原因,即使沒有它? – Nescio

+0

是的,我認爲是。 [Pep 420](https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages)引入了此更改。你正在使用哪個版本的Python? – Pramod

+0

我目前使用的是版本3.4.2 – Nescio