在我的脚本中包含一个python库

时间:2018-03-07 00:24:04

标签: python

我的系统管理员不允许全局安装python包。 我正在编写一个脚本,人们会调用它来为它们执行某些操作。我写的脚本需要某些库,如sqlalchemycoloredlogs。但是我可以安装python libs任何本地文件夹。即不是网站包。

我如何在与脚本相同的文件夹中安装libs,以便脚本可以访问它们?

我的文件夹层次结构是这样的

script_to_invoke.py
scriptpack/
    bin/
        coloredlogs
        coloredlogs.egg
        ...
    utils/
        util1.py
        util2.py

(所有指定的文件夹都有__init__.py

到目前为止我尝试过:

script_to_invoke.py内我使用

from scriptpack.utils invoke util1 # no problem here
from scriptpack.bin import coloredlogs # fails to find the import

我已经看了一些其他的答案,我不知道如何将它们与我的问题联系起来。

3 个答案:

答案 0 :(得分:1)

您可以使用if RainbowLabel.isHidden == true { UIView.animate(withDuration: TimeInterval(0.3), animations: { self.Red.frame = CGRect(x: self.Red.frame.origin.x, y: self.Red.frame.origin.y - 60 , width: 42, height: 21) }) {(finished) in if (126 ... 206).contains(self.Red.frame.origin.x) && (45 ... 85).contains (self.Red.frame.origin.y) { ProgressHUD.showSuccess("Score! Red") self.score += 1 self.scoreLabel.text = String(self.score) self.Red0 = 1 if self.Red0 == 1 && self.Orange0 == 1 && self.Yellow0 == 1 && self.Green0 == 1 && self.Blue0 == 1 && self.Purple0 == 1 { self.RainbowLabel.isHidden = true self.ResetLabel.isHidden = false ProgressHUD.showSuccess("15 Points") self.score += 15 self.scoreLabel.text = String(self.score) } } } } 标记在非全局位置(通常位于~/.local/lib/python<x.y>)中安装这些软件包,例如:

--user

这样您就不必担心改变导入的工作方式,并且您仍然符合您的系统管理员政策。

答案 1 :(得分:1)

如果您想尝试packaging up everything as a zipapp。这样做会产生一个单独的zip文件,它充当Python脚本,但可以包含大量嵌入式软件包。制作它的步骤是:

  1. 创建一个包含程序名称的文件夹(在我的示例中为testapp
  2. 将主脚本命名为__main__.py并将其放在该文件夹中
  3. 使用pip,将所需的软件包安装到包含--target=/path/to/testapp
  4. 的文件夹中
  5. 运行python3 -mzipapp testapp -p='/usr/bin/env python3'(提供shebang行是可选的;没有它,用户将需要使用python3 testapp.pyz运行包,而使用shebag,他们可以执行./testapp.pyz)< / LI>

    这会创建一个zip文件,其中包含您的脚本旁边的所有要求,甚至不需要解压缩才能运行(Python知道如何本地运行zip应用程序)。作为一个简单的例子:

    $ mkdir testapp
    $ echo -e '#!/usr/bin/python3\nimport sqlalchemy\nprint(sqlalchemy)' > __main__.py
    $ pip3 install --target=./testapp sqlalchemy
    $ python3 -mzipapp testapp -p='/usr/bin/env python3'
    $ ./testapp.pyz
    <module 'sqlalchemy' from './testapp.pyz/sqlalchemy/__init__.py'>
    

    显示简单主程序如何从同一个zipapp中访问sqlalchemy。它也更小(由于压缩)分发未压缩的模块:

    $ du -s -h testapp*
    13M     testapp
    8.1M    testapp.pyz
    

答案 2 :(得分:0)

我明白了!

必须指示Python查找.egg文件 这可以通过

完成
  1. 编辑PYTHONPATH var BEFORE 启动解释程序(或)
  2. 将鸡蛋的完整路径附加到sys路径
  3. 以下代码:

    import sys
    
    for entry in [<list of full path to egg files in bin dir>]:
        sys.path.append(str(entry))
    
    # Proceed with local imports