如何将Python包安装到/usr/local/bin?

4

我正在尝试在我的Ubuntu系统上安装一个Python包。我想通过一个我编写的安装脚本来安装它。setup.py脚本如下:

    from setuptools import setup

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

setup(
    name = 'pyduino',
    description = 'PyDuino project aims to make python interactive with hardware particularly arduino.',
    url = '###',
    keywords = 'python arduino',
    author = '###',
    author_email = '###',
    version = '0.0.0',
    license = 'GNU',
    packages = ['pyduino'],
    install_requires = ['pyserial'],
    classifiers = [

        # How mature is this project? Common values are
        #   3 - Alpha
        #   4 - Beta
        #   5 - Production/Stable
        'Development Status :: 3 - Alpha',
        'Intended Audience :: Developers',
        'Topic :: Software Development :: Build Tools', 
        'Programming Language :: Python :: 2',
        'Programming Language :: Python :: 2.6',
        'Programming Language :: Python :: 2.7',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.3',
        'Programming Language :: Python :: 3.4',
        'Programming Language :: Python :: 3.5',
    ],
    scripts=['pyduino/pyduino.py'],
)

安装包会安装在 /usr/local/bin 目录中。但是,当我在 /usr/local/bin 之外导入模块时,会出现导入错误。我尝试将路径更改为 /usr/local/bin,这样可以完美地工作,而且不会出现导入错误。如何安装包,以便我可以在任何目录中导入模块?先感谢您...


你确定这个软件包已经安装在/usr/local/bin目录下了吗?你使用的是哪个命令来进行安装的? - Laur Ivan
@LaurIvan 是的,我确定。当我将路径设置为/usr/local/bin时,就不会出现导入错误,我可以导入模块。 - abhay gurrala
@LaurIvan 我正在使用 sudo python setup.py install 安装这些包。 - abhay gurrala
2个回答

2
尝试使用pip安装您的软件包,使用以下命令:

pip install --install-option="--prefix=$PREFIX_PATH" package_name

如此描述 使用pip将Python包安装到不同目录中,我建议阅读以下内容:1. pip 2. virtualenv

祝你好运 :)

编辑:我发现该软件包是使用pip安装的,如下所示:

pip install --install-option="--prefix=/usr/local/bin" pyduino_mk

我正在使用 setup.py 安装软件包。因此,我的安装命令是 python setup.py install 而不是 pip。我认为你的回答适用于使用 pip 安装的软件包。有没有手动安装的建议? - abhay gurrala
现在我仔细阅读了问题,似乎你只是遇到了一个环境变量的问题,因为/usr/local/bin不在你的$PYTHONPATH中。尝试这样做-将/usr/local/bin永久添加到你的$PYTHONPATH中,像这样:
  1. 打开你的~/.bashrc文件并添加以下内容 export PYTHONPATH="${PYTHONPATH}:/my/other/path"
注销,重新登录以加载~/.bashrc并尝试导入包。当我安装在默认站点包文件夹之外时,我自己也做过这件事。让我知道它的进展如何。
- Miro Rodozov
除了将额外的路径添加到$PYTHONPATH中,我没有看到Python可执行文件知道/usr/local/bin中存在软件包的其他方法,所以可能有其他方法,但是 - 为什么要麻烦呢 :) 这似乎很简单。 - Miro Rodozov
就像我之前说的,我想要将代码分发给其他人,但不希望他们像我一样遇到问题。因此,我需要一个更简单的方法 :) - abhay gurrala
嗯,我认为setuptools的默认安装位置在/usr/local/bin。因此,有一个选项可以添加前缀路径,并且您可以在设置脚本中将该前缀路径作为$PYTHONPATH的默认值 - 就这样!你觉得呢?以下是如何描述前缀的方法:有一个package_dir = {'foo': 'lib'}选项,您可以尝试获取$PYTHONPATH变量并将其作为参数传递给该选项。 - Miro Rodozov
显示剩余2条评论

1

目前,您正在使用标记安装Python代码。这将将您的代码放置在/usr/local/bin中,该路径不在PYTHONPATH中。

根据文档,当您想要安装可执行脚本(从命令行调用的内容)时,应使用。否则,您需要使用。

我的方法如下:

  • 使用类似于packages=['pyduino']的方式在库中安装pyduino/pyduino.py
  • 创建一个包装器(shell或Python),能够调用已安装的脚本并通过scripts=[...]进行安装

对于您的模块,使用packages标记将其安装在/usr/local/lib/python...中,该路径在PYTHONPATH中。这将允许您使用import pyduino.pyduino.*导入脚本。

有关包装器脚本的部分:

最佳实践是将要执行的代码隔离,如果脚本是从命令行触发的,则应该使用类似以下的方式:
def main():
    # insert your code here
    pass

if __name__ == '__main__':
    main()
  • 假设有一个如上所述的 def main()
  • 在您的树中创建一个名为 scripts 的目录(与 setup.py 处于同一级别)
  • 创建一个名为 scripts/pyduino 的文件
  • scripts/pyduino 中:

    #!/usr/bin/env python
    from pydiuno.pyduino import main
    
    if __name__ == '__main__':
        main()
    
  • 将 `scripts = ['scripts/pyduino']` 添加到您的 setup.py 代码中

完美。但我仍然没有理解第二部分,即创建一个包装器(shell或python),能够调用您安装的脚本并通过scripts=[...]进行安装。在scripts中应该保留什么,什么是包装器?对此造成的不便请谅解... - abhay gurrala
你有一个 def main() 和一个 if __name__ == "__main__": main() 吗? - Laur Ivan
让我们在聊天中继续这个讨论 - Laur Ivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接