我刚刚在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 foo
或import .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"。对于要在可执行路径上的脚本来说,这不应该存在