我刚刚使用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,
)
答案 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()
这就是说;
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']},
...)
也就是说:
sys.path
上正确获取已安装的软件包,它知道如何连接到正确的python解释器,用于运行setup.py
的解释器。当有多个版本的python或在virtualenv中运行时,这很重要。这是为什么你永远不需要一个shebang。