如何运行用pybuilder构建的脚本?有没有`pyb 运行`?
How to run the script built with pybuilder? Is there `pyb run`?
请原谅我这个可能微不足道的问题,但是:我如何运行 pybuilder 发布的脚本?
我正在努力关注官方Pybuilder Tutorial。
我已经完成了这些步骤并成功生成了一个项目
- 运行s 单元测试
- 计算覆盖率
- 生成
setup.py
- 生成一个可以被
pip install
使用的.tar.gz
。
一切都很好,但我还是不明白真正的 运行nable 神器是什么?
target
目录中包含的所有内容看起来或多或少与 src
目录中的内容完全相同 + 其他报告和可安装的档案。
"Adding a runnable Script" 部分末尾的教程本身总结为 "the script was picked up"。 ok,捡起来了,现在我怎么运行呢?本教程在任何时候都没有演示我们实际上可以在屏幕上打印字符串 "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 $'[=13=]' 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
这确实成功地 运行s 脚本及其对用户定义包的所有依赖项,并打印:
Hello, world! 42 * 42 - 42 = 1722
但整个过程似乎很复杂。为了比较,在 SBT 中的类似情况下,我只会发出 single
run
来自 SBT-shell 的命令——这就是为什么上面的七步食谱对我来说有点可疑。
是否有类似 pyb run
或 pyb exec
插件的功能,但不需要我设置所有这些环境并安装任何东西?我正在寻找的是 SBT 中的 sbt run
或 Maven 中的 mvn exec:java
的类比,它将构建所有内容,设置所有 class 路径,然后 运行 class用main
的方法,不在项目目录外留下任何痕迹。
由于源代码和目标输出之间基本上没有区别,我可能遗漏了一些如何 运行 脚本的明显方法。如果根本不需要 PyBuilder
本身,那也很好:我想要的只是以某种方式在终端中打印 Hello, world! 42 * 42 - 42 = 1722
-string。
显然是以下工作流程:
- pyb 发布
- pip 安装。tar.gz
- runMyScript.py
- 卸载
正是 PyBuilder 的创建者所提出的 in this talk。
请注意,链接的视频是2014年的。如果有人能提出更精简的最近提供的解决方案,我当然会接受。
在 build.py
中创建任务
@task
def run(project):
path.append("src/main/python")
from test_pack import test_app
test_app.main()
尝试:
pyb run
请原谅我这个可能微不足道的问题,但是:我如何运行 pybuilder 发布的脚本?
我正在努力关注官方Pybuilder Tutorial。
我已经完成了这些步骤并成功生成了一个项目
- 运行s 单元测试
- 计算覆盖率
- 生成
setup.py
- 生成一个可以被
pip install
使用的.tar.gz
。
一切都很好,但我还是不明白真正的 运行nable 神器是什么?
target
目录中包含的所有内容看起来或多或少与 src
目录中的内容完全相同 + 其他报告和可安装的档案。
"Adding a runnable Script" 部分末尾的教程本身总结为 "the script was picked up"。 ok,捡起来了,现在我怎么运行呢?本教程在任何时候都没有演示我们实际上可以在屏幕上打印字符串 "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 $'[=13=]' 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
这确实成功地 运行s 脚本及其对用户定义包的所有依赖项,并打印:
Hello, world! 42 * 42 - 42 = 1722
但整个过程似乎很复杂。为了比较,在 SBT 中的类似情况下,我只会发出 single
run
来自 SBT-shell 的命令——这就是为什么上面的七步食谱对我来说有点可疑。
是否有类似 pyb run
或 pyb exec
插件的功能,但不需要我设置所有这些环境并安装任何东西?我正在寻找的是 SBT 中的 sbt run
或 Maven 中的 mvn exec:java
的类比,它将构建所有内容,设置所有 class 路径,然后 运行 class用main
的方法,不在项目目录外留下任何痕迹。
由于源代码和目标输出之间基本上没有区别,我可能遗漏了一些如何 运行 脚本的明显方法。如果根本不需要 PyBuilder
本身,那也很好:我想要的只是以某种方式在终端中打印 Hello, world! 42 * 42 - 42 = 1722
-string。
显然是以下工作流程:
- pyb 发布
- pip 安装。tar.gz
- runMyScript.py
- 卸载
正是 PyBuilder 的创建者所提出的 in this talk。
请注意,链接的视频是2014年的。如果有人能提出更精简的最近提供的解决方案,我当然会接受。
在 build.py
中创建任务@task
def run(project):
path.append("src/main/python")
from test_pack import test_app
test_app.main()
尝试:
pyb run