【问题标题】:import my local module in python3 so it can i installed in the system via pip在 python3 中导入我的本地模块,以便我可以通过 pip 将其安装在系统中
【发布时间】:2016-11-27 19:45:15
【问题描述】:

我的目录结构为:

   tree
    .
    ├── bin
    │   └── mkbib.py
    ├── LICENSE
    ├── mkbib
    │   ├── __init__.py         #empty file
    │   ├── menubar.ui          #a xml file. where should I place it?
    │   ├── menu.py
    │   ├── pybib.py
    │   └── view.py
    ├── mkbib.desktop.in    #should be copied to /usr/local/applications
    ├── README
    └── setup.py

bin/mkbib.py为主文件,导入mkbib/中的文件。在bin/mkbib.py,我使用:

import mkbib.menu as menu
import mkbib.view as view
# import view
# import pybib

如果所有文件都在同一个目录下,最后两行就足够了。我根据接受的答案 here 将它们分开。

但是,现在,当我尝试运行代码时,出现错误:

 File "mkbib.py", line 26, in __init__
    self.TreeView = view.treeview()
NameError: name 'view' is not defined

我的最终目标是在/bin/ 中安装mkbib 应用程序,与我链接的问题相同,但我没有任何成功。

我的setup.py 是:

from setuptools import setup, find_packages
from codecs import open
from os import path

here = path.abspath(path.dirname(__file__))
with open(path.join(here, 'README'), encoding='utf-8') as f:
    long_description = f.read()

setup(
    name='mkbib',
    version='0.1',
    description='BibTeX Creator',
    url='https://github.com/rudrab/mkbib',
    author='Rudra Banerjee',
    author_email='bnrj.rudra@gmail.com',
    license='GPLv3',
    packages=['mkbib'],
    package_dir={'mkbib': 'mkbib'},
    scripts=['bin/mkbib.py']
    )

当我运行setup.py 时,我得到了;

 sudo python3 setup.py develop
running develop
running egg_info
writing top-level names to mkbib.egg-info/top_level.txt
writing mkbib.egg-info/PKG-INFO
writing dependency_links to mkbib.egg-info/dependency_links.txt
reading manifest file 'mkbib.egg-info/SOURCES.txt'
writing manifest file 'mkbib.egg-info/SOURCES.txt'
running build_ext
Creating /usr/lib/python3.5/site-packages/mkbib.egg-link (link to .)
mkbib 0.1 is already the active version in easy-install.pth
Installing mkbib.py script to /usr/bin

Installed /home/rudra/Devel/mkbib/Mkbib
Processing dependencies for mkbib==0.1
Finished processing dependencies for mkbib==0.1

我也试过将pythonpath导出到mkbib:

echo $PYTHONPATH
~/Devel/mkbib/Mkbib/mkbib

正如我所说,如果所有文件都在同一个目录中,它的工作完美无瑕。

mkbib.py 的结构是(根据 GeckStar 的要求)

#!/usr/bin/python3

import gi
import sys
# import mkbib
import mkbib.menu as menu
import mkbib.view as view
# import view
# import pybib
import urllib.parse as lurl
import webbrowser
import os
from gi.repository import Gtk, Gio  # , GLib, Gdk
gi.require_version("Gtk", "3.0")


class Window(Gtk.ApplicationWindow):
    def __init__(self, application, giofile=None):
        Gtk.ApplicationWindow.__init__(self,
                                       application=application,
                                       default_width=1000,
                                       default_height=200,
                                       title="mkbib")

        self.TreeView = view.treeview()
        self.MenuElem = menu.MenuManager()
        self.Parser = pybib.parser()
        self.name = ""

.........
class mkbib(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(self)
        self.connect("startup", self.startup)
        self.connect("activate", self.activate)
..........

def install_excepthook():
    """ Make sure we exit when an unhandled exception occurs. """
    old_hook = sys.excepthook

    def new_hook(etype, evalue, etb):
        old_hook(etype, evalue, etb)
        while Gtk.main_level():
            Gtk.main_quit()
        sys.exit()
    sys.excepthook = new_hook


if __name__ == "__main__":
    app = mkbib()
    r = app.run(sys.argv)
    sys.exit(r)

请帮忙。

【问题讨论】:

  • 您是否真的运行 setup.py,来安装软件包?
  • jonrsharpe 是的,但我错误地展示了具有不同文件结构的旧 setup.py。正确(至少当前)setup.py 并且现在包含运行。请看一看。
  • 查看 mkbib.py 文件的其余部分会很有帮助,尤其是前 26 行,因为那是发生错误的地方。
  • 我真的不明白为什么要提出NameError。当您使用名称不明确的函数或类时,通常会发生这种情况。我建议您尝试使用其他名称导入mkbib.view,或更改mkbib 文件夹的名称,然后看看它是否有效。
  • @GeckStar:在我build 系统之后,如果我从 Mkbib 目录运行,现在它会为菜单和其他人提供 ImportError。这是因为,mkbib 的内容放在了 build/lib 中,而不是放在 /usr/lib/python3.5...

标签: python python-3.x setuptools setup.py


【解决方案1】:

这是 Python 的怪癖之一:设置模块和包的路径。在您的情况下,安装 mkbib 软件包后,bin/mkbib.py 应该有:

import mkbib

PYTHONPATH 没有任何更改。这是因为bin/mkbib.py 被设计为用作二进制文件并假定mkbib 包已经在默认的PYTHONPATH 上。您可以通过运行测试mkbib 是否在未修改的PYTHONPATH 上:

$ python -c 'import mkbib'

应该什么都不做。

Python 在解析相对路径时将当前目录 . 作为参考,这就是为什么您的设置在所有文件都位于一个文件夹中时有效的原因。

【讨论】:

  • 我不认为它的 python 的问题....如果你需要运行一个可执行文件,你必须把它的依赖放在适当的地方。你的评论是有效的,只有当 mkbib/ 目录是也放置在合适的目录中,例如/usr/lib64/python3.5/site-packages/,这就是问题所在:我该怎么做。
  • 您需要使用python setup.py build && sudo python setup.py install 安装软件包。我以为你已经这样做了。
猜你喜欢
  • 2018-06-13
  • 2011-03-20
  • 2022-08-11
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
相关资源
最近更新 更多