【问题标题】:What do I need to do to my python code to get it to be a module?我需要对我的 python 代码做些什么才能让它成为一个模块?
【发布时间】:2012-02-14 18:27:34
【问题描述】:

有人能告诉我将它打包成一个模块我做错了什么吗: https://github.com/xamox/python-zxing

我的 setup.py 如下:

#!/usr/bin/env python

from distutils.core import setup

setup(
    name='zxing',
    version='0.1',
    description="wrapper for zebra crossing (zxing) barcode library",
    url='http://simplecv.org',
    author='Ingenuitas',
    author_email='public.relations@ingenuitas.com',
    packages=['zxing'],
)

我正在尝试“导入 zxing”。我做了setup.py install,放到/usr/local/lib/python2.7/dist-packages/,但是import zxing不起作用。

我收到以下错误:

In [1]: import zxing.zxing
---------------------------------------------------------------------------
ResolutionError                           Traceback (most recent call last)
/home/xamox/<ipython-input-1-9ff7d0755c55> in <module>()
----> 1 import zxing.zxing

/usr/local/bin/zxing.py in <module>()
      3 __requires__ = 'zxing==0.1'
      4 import pkg_resources
----> 5 pkg_resources.run_script('zxing==0.1', 'zxing.py')

/usr/lib/python2.7/dist-packages/pkg_resources.pyc in run_script(self, requires, script_name)
    465         ns.clear()
    466         ns['__name__'] = name
--> 467         self.require(requires)[0].run_script(script_name, ns)
    468 
    469 

/usr/lib/python2.7/dist-packages/pkg_resources.pyc in run_script(self, script_name, namespace)
   1192         script = 'scripts/'+script_name
   1193         if not self.has_metadata(script):
-> 1194             raise ResolutionError("No script named %r" % script_name)
   1195         script_text = self.get_metadata(script).replace('\r\n','\n')
   1196         script_text = script_text.replace('\r','\n')

ResolutionError: No script named 'zxing.py'

【问题讨论】:

  • 这个模块的文件名是什么?它在您的本地目录中有效吗?
  • 它在我的本地目录中工作,但在运行 setup.py install 并尝试导入后,我收到以下错误:gist.github.com/b51c37cb5ac13557539d
  • 请将错误消息的实际文本复制并粘贴到此问题中。追逐链接是不可接受的。请找到错误信息中的文字,请复制。请用单词更新问题。还。请包括您的 setup.py 脚本,该脚本据称安装了您的模块。
  • 完成,并在上面更新。

标签: python module setuptools distutils


【解决方案1】:

当你这样做时

import zxing.zxing

一切正常 (dir(zxing.zxing) = ['BarCode', 'BarCodeReader', ...])。可能你希望人们只需要使用

import zxing

如果这是你想要的,你必须把下面的代码放到zxing/__init__.py

from zxing import *

或者更好

from zxing import BarCode, BarcodeReader, ...

【讨论】:

  • 实际上这行不通。如果我从那个目录运行它,它就可以工作,就像我从那个目录运行 python 一样。在我运行 python setup.py install 之后会发生什么,这似乎有效,然后我打开 ipython 并得到以下信息:gist.github.com/b51c37cb5ac13557539d
【解决方案2】:

查看您在评论中显示其 URL 的堆栈跟踪:

/usr/local/bin/zxing.py in <module>()
      3 __requires__ = 'zxing==0.1'
      4 import pkg_resources
----> 5 pkg_resources.run_script('zxing==0.1', 'zxing.py')

这表明它正在尝试从 /usr/local/bin/zxing.py 加载一些废话,其中包含不在您当前版本中的代码,例如“导入 pkg_resources”。看起来像是之前实验的碎片。摆脱它。

现在你有一个干净的甲板:

拥有一个空的__init__.py 和一个单一源文件包似乎毫无意义。我建议您删除__init__.py 并删除所有其他实验的痕迹(尤其是“构建”目录)。如果有文件夹/usr/local/lib/python2.7/dist-packages/zxing,请将其删除。

【讨论】:

  • 那是我的问题。由于某种原因,该脚本从上次开始就一直存在。我还必须将文件更改为 init.py,感谢那个花絮,因为我不得不导入 zxing.zxing。
  • 我不明白“我还必须将文件更改为”__init__.pyinit.py 或您打算输入的任何其他内容。你看过我回答的最后一段吗?
猜你喜欢
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 2012-10-04
相关资源
最近更新 更多