【问题标题】:Organizing python project with setting environment使用设置环境组织 python 项目
【发布时间】:2016-04-29 09:32:39
【问题描述】:

我开发 Python 工具。每个工具都是编程项目的一部分,带有用于启动程序的源文件和脚本。这里的语言是 Python,但也可以是其他语言。

src/
  package1/
    module1.py
  package2/
    module2.py
scripts/
  program1.py  # parses arguments; uses modules; starts workflow.
  program2.py  
  pylauncher.sh  # sets environment; deals with output; calls any specified python script. 

每个 Python 脚本都接受用户的输入,解析提供的参数,并使用相关的 Python 模块启动例程。最后用户只需要这样调用脚本:

$ cd path/scripts
$ python program1.py arg1 arg2

或者,根据解释器版本,

$ cd path/scripts
$ path/to/the/right/python program1.py arg1 arg2

目前我还有一个 bash 脚本,pylauncher.sh,用于设置 Python 路径、Python 库、将输入重定向到日志等。所以用户不必指定所有这些并且必须启动命令:

$ cd path/scripts
$ ./pylauncher program1.py

这很方便,因为它对用户隐藏了环境内容。但在我看来,也许用户不应该为调用启动器而烦恼。所以我想摆脱python脚本程序{1,2}.py并将pylauncher.sh重命名为程序{1,2}.sh。这样做时,之前的程序{1,2}.py 中使用的例程将被转移到模块的主函数中,或者只是移动到那里。

项目结构如下:

src/
  package1/
    module1.py
    program1.py  # parses arguments; use python modules; starts the program workflow.
  package2/
    module2.py
    program2.py
scripts/
  program1.sh  # sources set_environment.sh; calls program1.py
  program2.sh  # sources set_environment.sh; calls program2.py
  set_environment.sh

或者让程序{1,2}.py在scripts文件夹中:

src/
  package1/
    module1.py
  package2/
    module2.py
scripts/
  program1.py  # parses arguments; starts the program workflow.
  program1.sh  # sources set_environment.sh; calls program1.py
  program2.py
  program2.sh  # sources set_environment.sh; calls program2.py
  set_environment.sh

用户最终必须使用以下命令:

$ cd path/scripts
$ ./program1.sh  

所以我目前正在使用第一个解决方案和 pylauncher bash 脚本,我正在考虑更改为第二个解决方案。不过,我想了解其他软件开发人员的做法、习惯和做法。你会怎么做?您是否看到更方便的方式,对于用户,对于开发人员,如果可能的话避免冗余?欢迎任何建议和批评。

【问题讨论】:

    标签: python bash environment-variables


    【解决方案1】:

    您是否考虑将这些工具打包为单个文件可执行文件?

    这是我使用 pyinstaller 的一个非常基本的示例,我使用的是 linux 系统,但该工具是跨平台的,并且看起来有据可查。

    要求(用于构建的 python 标头和用于安装包的 PIP)

    sudo apt-get install python-dev python-pip
    sudo pip install pyinstaller 
    

    要构建的文件

    kalvatn@workstation|/tmp/python-executable » cat hello.py
    #!/usr/bin/env python
    
    if __name__ == '__main__':
        print 'hello world'
    

    用法(-F 标志指示 pyinstaller 创建单个文件可执行文件)

    kalvatn@workstation|/tmp/python-executable » pyinstaller -F hello.py
    kalvatn@workstation|/tmp/python-executable » ./dist/hello
    hello world
    

    文档

    【讨论】:

    • 感谢您的回答。我还没有考虑使用 pyinstaller。对于 Python 专有项目来说,这可能会很有趣。目前我正在寻找一种组织项目的通用方式。
    • @kaligne 哦,我以为这是一个 python 专有项目,我想你可能想澄清原始问题中的一些要点以获得更好的答案:)
    • 是的,很抱歉,这毕竟不是那么清楚。那我应该删除python标签吗?
    • 如果和python无关,那为什么要打上python的标签呢? :) 我想我会重写整篇文章,因为它充满了与 python 相关的文件夹结构,这有损于你想知道的明显更抽象的问题。我回答了 pyinstaller 的建议,因为似乎主要问题是如何组织和管理脚本以执行 python 程序,我仍然建议顺便进行某种打包
    • 我把这篇文章放在这里。也许稍后会出现更有趣的解决方法:) 如果我理解正确,pyinstaller 会处理 python 版本和程序使用的模块。所以我可以在 linux 机器上使用 pyinstaller,然后在任何(经过测试的)linux 机器上执行生成的二进制文件,而不管程序链接到的 python 版本和库。对吗?
    猜你喜欢
    • 2021-03-22
    • 2014-03-27
    • 2012-10-21
    • 1970-01-01
    • 2017-12-11
    • 2020-04-05
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    相关资源
    最近更新 更多