python - 如何定义一个函数作为包入口点?

标签 python python-3.x python-imaging-library entry-point

我创建了一个 python 程序,它只是从图像中删除绿色背景。

现在我想实现定义为入口点的函数remove_green_background()。我搜索了很多网站以及 stackoverflow,但无法理解入口点是如何工作的。

所以任何人都可以使用这段代码向我详细解释这些入口点放在哪里?

from PIL import Image
import sys
import os


def rgb_to_hsv(r, g, b):
    maxc = max(r, g, b)
    minc = min(r, g, b)
    v = maxc
    if minc == maxc:
        return 0.0, 0.0, v
    s = (maxc-minc) / maxc
    rc = (maxc-r) / (maxc-minc)
    gc = (maxc-g) / (maxc-minc)
    bc = (maxc-b) / (maxc-minc)
    if r == maxc:
        h = bc-gc
    elif g == maxc:
        h = 2.0+rc-bc
    else:
        h = 4.0+gc-rc
    h = (h/6.0) % 1.0
    return h, s, v


GREEN_RANGE_MIN_HSV = (100, 80, 70)
GREEN_RANGE_MAX_HSV = (185, 255, 255)

def remove_green_background():
    # Load image and convert it to RGBA, so it contains alpha channel
    name, ext = os.path.splitext(Filepath)
    im = Image.open(Filepath)
    im = im.convert('RGBA')

    # Go through all pixels and turn each 'green' pixel to transparent
    pix = im.load()
    width, height = im.size
    for x in range(width):
        for y in range(height):
            r, g, b, a = pix[x, y]
            h_ratio, s_ratio, v_ratio = rgb_to_hsv(r / 255.0, g / 255.0, b / 255.0)
            h, s, v = (h_ratio * 360, s_ratio * 255, v_ratio * 255)

            min_h, min_s, min_v = GREEN_RANGE_MIN_HSV
            max_h, max_s, max_v = GREEN_RANGE_MAX_HSV
            if min_h <= h <= max_h and min_s <= s <= max_s and min_v <= v <= max_v:
                pix[x, y] = (0, 0, 0, 0)


    im.save(name + '.png')


if __name__ == '__main__':
    remove_green_background()

最佳答案

您可能知道,Python 是一种脚本语言,因此程序的执行将从源文件的最顶部开始,一直持续到最后。 因此,如果您执行文件 mycode.py使用命令 python mycode.py执行将从源文件的最顶部开始 mycode.py

但是,这种方法在大型应用程序中会带来一些问题。通常,您运行的第一个命令是导入,它基本上获取其他一些 Python 文件,并执行 in 中的代码。因此,作为一个实际示例,假设您有 2 个文件 first.pysecond.pyfirst.py开始如下:

    import second

second开始如下:

    def a_function():
      # do something

然后Python看到导入命令,运行second.py ,并初始化函数a_function()这样它现在就可以在 first.py 内使用

但是second.py还可能包含在解释器在文件上运行时立即执行的代码,如下所示:

    def a_function():
      # do something
    print("I am called upon execution")

现在我们遇到一个问题:当first.py时,打印语句将被执行。进口second.py .

为了解决这个问题,特别是在将来导入的文件中使用了以下措施:

    def a_function():
      # do something

    if __name__ == "__main__":
      print("I am executed")

这不像 C 入口点 ( int main(){...} )。事实上,C 编译器会寻找一个入口点来在代码中的给定点开始执行。 Pyhton 解释安装只是对预定义的全局( __name__ )执行检查。如果变量等于 "__main__" ,这是一个非常笼统的解释,它表示该文件正在执行,否则表示该文件正在导入(因此检查失败,代码不执行)。

因此,在您的情况下,只需定义您的函数( def remove_green_background(): ),并在源文件中首先调用它(基本上,第一个命令没有缩进)

关于python - 如何定义一个函数作为包入口点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54161143/

相关文章:

python - RLE8图像支持/用Pillow解压(PIL fork)

python - 如何在枕头python中制作文字阴影效果?

根据两组有效条目检查列表端点的pythonic方法

python - 将python包从本地目录导入解释器

python - 以月为单位绘制 x 轴

python - 根据 Pandas 数据框中的另一列获取两列的频率计数

使用 AjaxUpload 的 Python 图片上传

python - 检查大量字符串是否存在的有效方法

python - 无法在 flask 中创建 key ;返回 “name ' session '未定义”

python - 对 map 对象进行成员资格测试时出现意外结果