2015-12-14 130 views
1

我有一個包,我想從我自己的Python腳本中自動安裝和使用。使用setup.py安裝後導入python包,而不重新啓動?

現在我有這樣的:

>>> # ... code for downloading and un-targzing 

>>> from subprocess import call 
>>> call(['python', 'setup.py', 'install']) 
>>> from <package> import <name> 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named <package> 

然後我可以繼續這樣的:

>>> exit() 
$ python 
>>> from <package> import <name> 

,它工作得很好。出於某種原因,如果我在運行setup.py文件後重新啓動,Python可以很好地拿起軟件包,但如果我不這樣做,則無法啓動。我怎樣才能使它的工作沒有在中間重啓步驟? (還有,在Python腳本中使用subprocess.call()來運行setup.py有更好的選擇嗎?看起來愚蠢的是從一箇中產生了一個全新的Python解釋器,但我不知道如何通過該安裝參數。 )

+0

您使用的環境呢? – postelrich

+0

@riotburn - 不知道你在說什麼,所以我猜不是?我通常使用'pip'來安裝所有東西,僅僅因爲某種原因,我需要的一個SDK不能通過PyPI來使用 - 相反,公司會讓你從他們的網站下載一個.tar.gz文件,並告訴你在裏面運行'setup.py'。 – ArtOfWarfare

回答

2

根據你的Python版本,你想看看impimportlib

例如爲Python 3,你可以這樣做:

from importlib.machinery import SourceFileLoader 
directory_name = # os.path to module 
# where __init__.py is the module entry point 
s = SourceFileloader(directory_name, __init__.py).load_module() 

,或者如果你覺得勇敢,你的Python路徑知道的目錄:

map(__import__, 'new_package_name') 
+0

+1'感覺勇敢' - 如果一個文件有錯誤,那麼整個導入都會失敗。我通常會對文件進行循環並導入(或導入特定文件)。我認爲importlib只來自Python 2.7及以上版本:http://stackoverflow.com/questions/34275884/import-python-package-after-installing-it-with-setup-py-without-restarting似乎有更多細節。 – Jmons

+0

'importlib'對python3有效。我在[我的一個項目中]使用它(https://github.com/tristanfisher/yams/blob/master/yams_api/plugins/dev/__init__.py#L20-L26)。 – 2015-12-14 20:41:43

+0

哦,是的,我絕對支持導入庫的使用 - 它是我認爲需要關心的映射位,但這一切取決於您相信導入庫的質量。 (對不起,我錯了,我的意思是它只有2.7以上...不僅僅是特定的2.7) – Jmons