2014-03-05 66 views
0

我剛剛註冊我的新包PIPPIP安裝全局腳本拋出異常,本地副本完美的作品

python setup.py register 
python setup.py sdist upload 

而我想用全局(即無的virtualenv)其他機器上安裝它「PIP 「:

sudo pip install standardiser 

這一切都很好,因爲我已經一個文件註冊爲一個腳本:

setup(
... 
scripts=['standardiser/bin/standardiser.py'], 
) 

'standariser.py'現在可作爲全系統的CLI命令使用。但是,如果我執行它,我越來越:

[email protected]:~/Documents/ci/curation_interface/trunk/src$ standardiser.py 
Traceback (most recent call last): 
    File "/usr/local/bin/standardiser.py", line 32, in <module> 
    from standardiser import standardise, SDF 
    File "/usr/local/bin/standardiser.py", line 32, in <module> 
    from standardiser import standardise, SDF 
ImportError: cannot import name standardise 

我得到同樣的,當我明確地調用蟒蛇:

python /usr/local/bin/standardiser.py 

但是,如果我這個複製到一些本地文件夾:

sudo cp python /usr/local/bin/standardiser.py bla.py 

並從那裏運行它:

[email protected]:~$ python bla.py 
usage: bla.py [-h] [-V] [-r] infile 
bla.py: error: too few arguments 

我沒有任何ImportEror s。我做錯了什麼?你可以幫我嗎?

我setyp.py:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

__author__ = 'mnowotka' 

import sys 

try: 
    from setuptools import setup 
except ImportError: 
    from ez_setup import use_setuptools 
    use_setuptools() 
    from setuptools import setup 
setup(
    name='standardiser', 
    version='0.1.4', 
    author='Francis Atkinson', 
    author_email='[email protected]', 
    description='Provides a simple way of standardising molecules as a prelude to e.g. molecular modelling exercises.', 
    url='https://www.ebi.ac.uk/chembldb/index.php/ws', 
    license='Apache License, Version 2.0', 
    scripts=['standardiser/bin/standardiser.py'], 
    packages=['standardiser'], 
    long_description=open('ReadMe.txt').read(), 
    package_data={ 
     'standardiser': ['bin/*', 'data/*', 'docs/*', 'knime/*', 'test/*',], 
     }, 
    classifiers=['Development Status :: 2 - Pre-Alpha', 
       'Environment :: Console', 
       'Intended Audience :: Science/Research', 
       'License :: OSI Approved :: Apache Software License', 
       'Operating System :: OS Independent', 
       'Programming Language :: Python', 
       'Topic :: Scientific/Engineering :: Chemistry'], 
    zip_safe=False, 
) 
+0

發佈您的'setup.py' – slezica

+0

@uʍopǝpısdn - 完成 – mnowotka

回答

0

你問一個被安裝在名爲standardiser.py腳本;該腳本(至少,你已經上傳到奶酪店的一個)包括行:

from standardiser import standardise, SDF 

但是那一個ambigious進口;您正在執行的腳本/usr/local/bin/standardise.py出現在sys.path中,因爲主腳本位於此處。它正在導入本身

無論如何,您應該使用setuptools的console_scripts功能。

#! /guess/path/to python 
from standardise import import * 
do_things() 
do_more_things() 

from __future__ import absolute_import 
from standardise import import * 

def main(): 
    do_things() 
    do_more_things() 

if __name__ == '__main__': 
    main() 

這就是說改變你的腳本文件;

  • 擺脫shebang;你從來不需要Python!
  • 使用absolute_import功能來獲取命名foo.bar.foo該模塊能夠導入foo,而不是隻foo.bar.foo(仍可以導入foo.bar.foo爲任何from foo.bar import fooimport .foo)。__future__進口必須首先出現在源文件中,最重要的是在任何其他非註釋行(包括其他進口)
  • 之前;包導入時間副作用的功能,並且只調用這些副作用,如果是這樣的「主腳本」

然後改變你的setup.py各地從

setup(
    scripts=['standardiser/bin/standardiser.py'], 
    ...) 

setup(
    entry_points={ 
     'console_scripts': [ 
      'standardiser=standardiser.bin.standardiser:main']}, 
    ...) 

也就是說:

  • 使用入口點;在這種情況下,setuptools知道如何在sys.path上正確地獲取已安裝的軟件包,並知道如何連接到適當的python解釋器,該解釋器用於運行setup.py。當有多個版本的python或在virtualenv中運行時,這很重要。這是爲什麼你永遠不需要一個shebang。
  • 從安裝的可執行文件名稱中刪除'.py'。這不應該存在於您的可執行文件路徑中的腳本。
+0

明智的答案,非常有幫助,非常感謝! – mnowotka