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



我刚刚在PIP注册了我的新软件包

python setup.py register
python setup.py sdist upload

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

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,
)

您要求安装一个名为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()

也就是说;

  • 除掉舍邦;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时,或者在虚拟环境中运行时,这一点很重要。这就是为什么你永远不需要谢邦
  • 从已安装的可执行文件名称中删除".py"。对于要在可执行路径上的脚本来说,这不应该存在

最新更新