是否可以在终端中调用 python 函数?

Is it possible to call a python function in a terminal?

我希望能够 运行 一个 python 程序并在终端中键入一个函数并执行该函数。例如:

我在python脚本中定义了一个函数

def hi():
   print('hello')

当程序正在 运行ning 时,我在终端中输入“hi()”或“hi”,然后返回“hello”。

我的最终目标是拥有许多可以随时调用的不同功能。我知道我可以用大量 if/elif 语句对此进行硬编码,但这是一个混乱且看似不切实际的解决方案。

使用的一个例子是 discord 机器人,它可以查找前缀和后面的命令以及 运行 被调用的函数

有什么方法可以让用户看起来很干净吗?

#抱歉格式不正确,我是 Stack Overflow 的新手

这可能会变得复杂。一个基本的解决方案是从全局命名空间中获取函数对象。

def hi():
    print("Hello")

def bye():
    print("Sorry, I'm staying")

while True:
    try:
        cmd = input("what up? ")
        globals()[cmd.strip()]()
    except KeyError:
        print("Invalid")

您可以使用自己的字典代替全局命名空间,但需要对其进行初始化。这可以帮助实现类似帮助系统的东西。您甚至可以将所有命令放在它们自己的模块中,使用 its 命名空间而不是您自己的字典。

然后是提供参数的问题。如果你想做类似的事情,你可以用逗号或类似的东西分割字符串。

您甚至可以探索“Python 中的领域特定语言”以获得更复杂但更具表现力的解决方案。

我想你可以使用这个代码:

import sys

def hi():
   print('hello')

while True:
    c = sys.stdin.readlines(1)[0].split('\n')[0]
    eval(c)()

eval() 可以使您的字符串成为函数并且 sys.stdin 具有读取您的 cmd 输入的函数。

问题 1

I want to be able to run a python program and type a function in the terminal and have the function execute. For example:

本质上你是在问:我怎样才能link一个命令的可执行文件或脚本,以便它可以在我的终端中运行。为此,首先创建 Python 脚本并将其放置在某处。下一步是使脚本可以从终端内的任何目录访问。这将取决于您的平台。我先解释 linux 然后是 windows.

如果您在 linux 或 mac,现在是时候弄清楚如何从任何地方而不是从一个地方 运行 程序目录。

您应该在 Python 程序的顶部包含这两个 shebang 以简化 error-prone。您可以 google 它们的含义与“python3 shebang”和“python3 encoding shebang”

#!/usr/bin/python3
# -*- coding: utf-8 -*-

从您的终端开始(它应该 运行 您的程序):

username@pc:~$ python3 /full/path/to/my_file.py

一旦你开始工作,就可以link你的程序执行命令了。您可以通过在 linux/mac 上使用 bash 别名轻松地做到这一点,方法是在位于您的主目录中的 .bashrc 配置文件中添加一个新行(在终端中使用“cd ~”到那里)。现在将此行添加到您的 .bashrc 到 运行 带有别名的示例

alias my_command='python3 python3 /full/path/to/my_file.py'

现在重新启动您的终端,my_command 应该从任何目录。

如果您在 windows,现在还可以让文件从任何地方执行。首先,您必须将 .py 文件与解释器相关联。使用“打开方式”菜单并将其文件类型分配给本地 python.exe

如果操作正确,双击文件应该会打开终端片刻,运行 脚本然后关闭。您可以在程序末尾添加 input() 调用,让它等待输入关闭。

现在是时候将 /full/path/to/my_file.py 添加到 windows 系统 PATH 以便它可以在终端中的任何文件夹中工作。您可以通过向系统 PATH 添加一个新文件夹来完成此操作。在这种情况下,这意味着将 /full/path/to/ 添加到 PATH。或者,您可以将脚本放置在 PATH 中已经存在的位置,例如 C:\WINDOWS\system32C:\WINDOWS\.

现在重新启动您的终端,使用 my_file 应该 运行 您的脚本。如果您希望将脚本放在自定义位置而不是 PATH 中已有的文件夹,请参阅



问题 2

and while program is running, I type "hi()" or "hi" in the terminal and "hello" is returned.

我假设您指的是打印,而不是 returning。很难将 return 字符串发送到控制台。您正在寻找 input 函数以在此处获取用户输入。



问题 3

My end goal is to have many different functions that can be called any time. I understand I could hard-code this with a ton of if/elif statements but that is a messy and seemingly impractical solution.

你可以为此制作多个小程序,也可以制作一个大程序。您还应该在没有最喜欢的搜索引擎的情况下搜索“python 命令行参数”。学习这对任务很有用。



问题 4

An example of this in use is with discord bots that can look for a prefix and command following it and run the function that was called

这是完全不同的问题。您应该搜索有关使用 python 制作不和谐机器人的信息。让命令在 discord 中工作与在你的控制台中工作是非常不同的。

问题 5

Is there any way I can do this in a way that is clean looking to the user?

是的。您应该查看 python 的 input() 函数,并可能弄清楚如何清除终端屏幕,例如:

import os

def clear():
    cmd = "clear" # default to linux command
    if os.name == ("nt"):  # If Machine is running on Windows, use cls
        cmd = "cls"
    os.system(command)

>>> clear()

在 Discord 中让事情变得“干净”是完全不同的问题,您必须首先了解更多关于 Discord 机器人的信息。我建议 youtube 教程和 discord 的官方文档。