PIP安装的全局脚本抛出异常,本地副本完美无缺

时间:2014-03-05 15:17:47

标签: python virtualenv pip importerror pypi

我刚刚使用PIP

注册了我的新软件包
python setup.py register
python setup.py sdist upload

我想使用'PIP'在全球其他机器上安装它(即没有virtualenv):

sudo pip install standardiser

这一切都很顺利,因为我有一个文件注册为脚本:

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

'standariser.py'现在可用作系统范围的CLI命令。但如果我执行它,我会得到:

mnowotka@candela:~/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时,我得到了同样的结果:

python /usr/local/bin/standardiser.py

但如果我将其复制到某个本地文件夹:

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

从那里开始运行:

mnowotka@candela:~$ python bla.py
usage: bla.py [-h] [-V] [-r] infile
bla.py: error: too few arguments

我没有ImportEror个。我做错了什么?你能救我吗?

我的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='francis@ebi.ac.uk',
    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,
)

1 个答案:

答案 0 :(得分:0)

您要求安装名为standardiser.py的脚本;该脚本(至少是您上传到奶酪店的那个)包含以下行:

from standardiser import standardise, SDF

但这是一个暧昧的进口;您正在执行的脚本,/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”。对于可执行路径上的脚本,这不应该存在。