从 Linux 控制台运行函数(来自 .py 文件)

发布于 2024-10-03 18:36:37 字数 317 浏览 3 评论 0原文

可能标题说的不是很清楚,我详细说一下。

我有一个 python 脚本,可以打开 ppm 文件,应用选定的过滤器(旋转...)并创建新图片。直到这里一切正常。

但我想通过 Linux 控制台执行相同的操作,例如:

ppmfilter.py ROTD /path/imageIn.ppm /path/imageOut.ppm

这里 ROTD 是应用旋转的函数的名称。

我不知道该怎么做,我正在寻找一个可以让我做到这一点的图书馆。

期待您的帮助。

PS:我使用的是python 2.7

maybe the title is not very clear, let me elaborate.

I have a python script that open a ppm file , apply a chosen filter(rotations...) and create a new picture. until here everything work fine.

but I want to do the same thing through a linux console like:

ppmfilter.py ROTD /path/imageIn.ppm /path/imageOut.ppm

here ROTD is the name of the function that apply a rotation.

I don't know how to do this, I'm looking for a library that'll allow me to do this.

looking forward for your help.

P.S.: I'm using python 2.7

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

一生独一 2024-10-10 18:36:37

有一个相对简单的方法:

您可以使用“globals()”确定全局名称(函数、变量等)。这为您提供了所有全局符号的字典。您只需要检查类型(使用 type() 和模块类型),如果它是一个函数,您可以使用 sys.argv 调用它:

import types
import sys

def ROTD(infile, outfile):
    # do something

if __name__ == '__main__':
    symbol = globals().get(sys.argv[1])
    if hasattr(symbol, '__call__'):
        symbol(*sys.argv[2:])

这会将程序参数(不包括文件名和命令名)传递给的功能。

编辑:请不要忘记错误处理。为了清楚起见,我省略了它。

There is a relatively easy way:

You can determine the global names (functions, variables, etc.) with the use of 'globals()'. This gives you a dictionary of all global symbols. You'll just need to check the type (with type() and the module types) and if it's a function, you can call it with sys.argv:

import types
import sys

def ROTD(infile, outfile):
    # do something

if __name__ == '__main__':
    symbol = globals().get(sys.argv[1])
    if hasattr(symbol, '__call__'):
        symbol(*sys.argv[2:])

This will pass the program argument (excluding the filename and the command name) to the function.

EDIT: Please, don't forget the error handling. I omited it for reasons of clarity.

鱼窥荷 2024-10-10 18:36:37

使用 main() 函数:

def main()
   # call your function here

if __name__ == "__main__":
   main()

Use main() function:

def main()
   # call your function here

if __name__ == "__main__":
   main()
不念旧人 2024-10-10 18:36:37

一个很好的方法是在模块内定义一个大字典{alias: function}。例如:

actions = {
    'ROTD': ROTD,
    'REFL': reflect_image,
    'INVT': invIm,
}

你明白了。然后获取第一个命令行参数并将其解释为该字典的键,并将 actions[k] 应用于其余参数。

A nice way to do it would be to define a big dictionary {alias: function} inside your module. For instance:

actions = {
    'ROTD': ROTD,
    'REFL': reflect_image,
    'INVT': invIm,
}

You get the idea. Then take the first command-line argument and interpret it as a key of this dictionary, applying actions[k] to the rest of the arguments.

姜生凉生 2024-10-10 18:36:37

您可以在 ppmfilter.py main 部分中执行以下操作:

if __name__ == "__main__":
  import sys
  ROTD(sys.argv[1], sys.argv[2]) # change according to the signature of the function

并调用它: python ppmfilter.py file1 file2

您还可以运行 python -c 在包含 *.py 文件的目录中:

python -c "import ppmfilter; ppmfilter.ROTD('/path/to/file1', '/path/to/file2')"

You can define in your ppmfilter.py main section doing this:

if __name__ == "__main__":
  import sys
  ROTD(sys.argv[1], sys.argv[2]) # change according to the signature of the function

and call it: python ppmfilter.py file1 file2

You can also run python -c in the directory that contains you *.py file:

python -c "import ppmfilter; ppmfilter.ROTD('/path/to/file1', '/path/to/file2')"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文