如何运行pybuilder构建的脚本?有`pyb run`吗?

问题描述 投票:0回答:3

请原谅我这个可能很琐碎的问题,但是:如何运行 pybuilder 发布的脚本?


我正在尝试遵循官方 Pybuilder 教程

我已经完成了这些步骤并成功生成了一个项目,

  • 运行单元测试
  • 计算覆盖率
  • 生成
    setup.py
  • 生成可供
    .tar.gz
    使用的
    pip install

这一切都非常好,但我仍然不明白实际的可运行工件是什么?

target
目录中包含的所有内容看起来或多或少与
src
目录中的内容+附加报告和可安装档案完全相同。

教程本身在“添加可运行脚本”部分的末尾得出结论:“脚本已被拾取”。好的,它已被拾取,现在我该如何运行它?本教程从未证明我们实际上可以打印字符串“Hello, World!”在屏幕上,尽管事实上整个玩具项目就是这样做的。


MCVE

下面是一个 Bash 脚本,它使用 Python 源文件和构建脚本生成以下目录树:

projectRoot
├── build.py
└── src
    └── main
        ├── python
        │   └── pkgRoot
        │       ├── __init__.py
        │       ├── pkgA
        │       │   ├── __init__.py
        │       │   └── modA.py
        │       └── pkgB
        │           ├── __init__.py
        │           └── modB.py
        └── scripts
            └── entryPointScript.py

7 directories, 7 files
================================================================================
projectRoot/build.py
--------------------------------------------------------------------------------
from pybuilder.core import use_plugin

use_plugin("python.core")
use_plugin("python.distutils")

default_task = "publish"

================================================================================
projectRoot/src/main/scripts/entryPointScript.py
--------------------------------------------------------------------------------
#!/usr/bin/env python

from pkgRoot.pkgB.modB import b

if __name__ == "__main__":
  print(f"Hello, world! 42 * 42 - 42 = {b(42)}")

================================================================================
projectRoot/src/main/python/pkgRoot/pkgA/modA.py
--------------------------------------------------------------------------------
def a(n):
  """Computes square of a number."""
  return n * n

================================================================================
projectRoot/src/main/python/pkgRoot/pkgB/modB.py
--------------------------------------------------------------------------------
from pkgRoot.pkgA.modA import a

def b(n):
  """Evaluates a boring quadratic polynomial."""
  return a(n) - n

生成示例项目的完整脚本(免责声明:按原样提供,修改文件和目录,执行风险自负):

#!/bin/bash

# Creates a very simple hello-world like project
# that can be build with PyBuilder, and describes
# the result.

# Uses BASH heredocs and `cut -d'|' -f2-` to strip
# margin from indented code.

# strict mode
set -eu

# set up directory tree for packages and scripts
ROOTPKG_PATH="projectRoot/src/main/python/pkgRoot"
SCRIPTS_PATH="projectRoot/src/main/scripts"
mkdir -p "$ROOTPKG_PATH/pkgA"
mkdir -p "$ROOTPKG_PATH/pkgB"
mkdir -p "$SCRIPTS_PATH"

# Touch bunch of `__init__.py` files
touch "$ROOTPKG_PATH/__init__.py"
touch "$ROOTPKG_PATH/pkgA/__init__.py"
touch "$ROOTPKG_PATH/pkgB/__init__.py"

# Create module `modA` in package `pkgA`
cut -d'|' -f2- <<__HEREDOC > "$ROOTPKG_PATH/pkgA/modA.py"
  |def a(n):
  |  """Computes square of a number."""
  |  return n * n
  |
__HEREDOC

# Create module `modB` in package `pkgB`
cut -d'|' -f2- <<__HEREDOC > "$ROOTPKG_PATH/pkgB/modB.py"
  |from pkgRoot.pkgA.modA import a
  |
  |def b(n):
  |  """Evaluates a boring quadratic polynomial."""
  |  return a(n) - n
  |
__HEREDOC

# Create a hello-world script in `scripts`:
cut -d'|' -f2- <<__HEREDOC > "$SCRIPTS_PATH/entryPointScript.py"
  |#!/usr/bin/env python
  |
  |from pkgRoot.pkgB.modB import b
  |
  |if __name__ == "__main__":
  |  print(f"Hello, world! 42 * 42 - 42 = {b(42)}")
  |
__HEREDOC

# Create a simple `build.py` build script for PyBuilder
cut -d'|' -f2- <<__HEREDOC > "projectRoot/build.py"
  |from pybuilder.core import use_plugin
  |
  |use_plugin("python.core")
  |use_plugin("python.distutils")
  |
  |default_task = "publish"
  |
__HEREDOC

#################################################
#   Directory tree construction finished, only  #
#   debug output below this box.                #
#################################################

# show the layout of the generater result
tree "projectRoot"

# walk through each python file, show path and content
find "projectRoot" -name "*.py" -print0 | \
while IFS= read -r -d $'\0' pathToFile
do
  if [ -s "$pathToFile" ]
  then
    printf "=%.0s" {1..80} # thick horizontal line
    echo ""
    echo "$pathToFile"
    printf -- "-%.0s" {1..80}
    echo ""
    cat "$pathToFile"
  fi
done

我发现运行新构建的项目的最简单方法如下(从包含

projectRoot
的目录中使用):

virtualenv env
source env/bin/activate
cd projectRoot
pyb
cd target/dist/projectRoot-1.0.dev0/dist/
pip install projectRoot-1.0.dev0.tar.gz
entryPointScript.py

这确实成功运行了脚本及其对用户定义包的所有依赖项,并打印:

Hello, world! 42 * 42 - 42 = 1722

但是整个过程看起来相当复杂。作为比较,在 SBT 的类似情况下,我只会发行单曲

run

来自 SBT-shell 的命令——这就是为什么上面的七步配方对我来说有点可疑。

是否有类似

pyb run
pyb exec
插件具有相同功能,但不需要我设置所有这些环境并安装任何内容?我正在寻找的是 SBT 中的
sbt run
或 Maven 中的
mvn exec:java
的类似物,它将构建所有内容,设置所有类路径,然后使用
main
方法运行该类,而不会在外部留下任何痕迹项目目录。

由于源代码和目标的输出之间本质上没有区别,因此我可能缺少一些运行脚本的明显方法。如果根本不需要

PyBuilder
本身,那也没关系:我想要的只是以某种方式在终端中打印
Hello, world! 42 * 42 - 42 = 1722
字符串。

python virtualenv pybuilder
3个回答
3
投票

在build.py中创建任务

@task
def run(project):
    path.append("src/main/python")
    from test_pack import test_app
    test_app.main()

尝试:

pyb run


2
投票

显然是以下工作流程:

  • pyb 发布
  • pip 安装.tar.gz
  • runMyScript.py
  • 卸载

正是 PyBuilder 的创建者在本次演讲中所提出的

请注意,链接的视频是 2014 年的。如果有人可以提出最近提供的更精简的解决方案,我当然会接受。


0
投票

如果您想使用

pybuilder
并实际“运行”主项目目录中的代码(在
/src/main/python
中),您可以...

  • “插入”目录
    build.py
  • 从模块导入必需的函数
  • 然后写任务。

为了与 pybuilder 教程保持一致,我们假设文件名是

helloworld.py
(在
/src/main/python
中),该文件中的函数是
helloworld

您可以通过将以下代码片段包含到

build.py
文件的顶部部分来运行此程序:

# in build.py

import sys
import os

# Add src/main/python to sys.path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src', 'main', 'python'))

from helloworld import helloworld

然后,在

build.py
文件的底部,您可以包含一个可用于执行代码的任务。

考虑

helloworld

的背景
© www.soinside.com 2019 - 2024. All rights reserved.