【问题标题】:Linux, Python open terminal run global python commandLinux、Python打开终端运行全局python命令
【发布时间】:2018-01-21 22:40:17
【问题描述】:

不确定这是否可能。我有一组 python 脚本,并修改了 ~/.bashrc 中的 linux PATH,这样每当我打开终端时,python 脚本就可以作为命令运行。

export PATH=$PATH:/home/user/pythonlib/

my_command.py 位于上述路径中。

我可以在终端的任何地方运行 my_command.py (args),它会运行 python 脚本。

我想通过不同的 Python 脚本控制此功能,因为这将是自动化处理例程的最快解决方案。所以我需要它来打开一个终端并从我正在处理的 python 脚本中运行 my_command.py (args)。

我已经尝试过子进程:

import subprocess
test = subprocess.Popen(["my_command.py"], stdout=subprocess.PIPE)
output = test.communicate()[0]

虽然 my_command.py 通常在我启动的任何终端中都可用,但在这里我无法访问它,返回未找到文件。

我可以使用 os 启动一个新终端,然后输入 my_command.py,它就可以工作了

os.system("x-terminal-emulator -e /bin/bash")

那么,有没有办法让第二种方法接受你想用 args 从 python 运行的脚本?

Ubuntu 16

谢谢:)

【问题讨论】:

  • 可执行文件名为my_command.py,而不是my_command$my_command 是什么?是否有一个名为 my_command 的 shell 变量是您希望 python 知道的?
  • 从终端,我只需要输入“my_command”而不是.py。在子进程中添加 .py 没有区别。 my_command 只是一个 python 文件 my_command.py。
  • my_commandmy_command.py$my_command 是三个不同的东西,或者你有符号链接吗?这不是 Windows,它不会自动添加扩展名,还是您在 shell 中使用别名?
  • 我很抱歉造成混乱。 $ 只是表示终端窗口。我没有在任何地方写“我的命令”?当您注册 python 项目的 PATH 时,您可以从终端窗口将文件 my_command.py 引用为只是 my_command。
  • shell 中的别名。

标签: python linux bash shell


【解决方案1】:

Popen 不会为您在 python 脚本中创建的会话加载系统路径。您必须修改会话中的 PATH 以将目录包含到您的项目中,如下所示:

someterminalcommand = "my_command.py (args)"

my_env = os.environ.copy()
my_env["PATH"] = "/home/usr/mypythonlib/:" + my_env["PATH"]

combine = subprocess.Popen(shlex.split(someterminalcommand), env=my_env)

combine.wait()

这允许我从不同的 python 会话运行我的“my_command.py”文件,就像我打开了一个终端窗口一样。

【讨论】:

  • 呃,这是我发布的问题的确切答案。为什么有人会否决它?
  • 我不知道。我不知道为什么我的答案被否决了,尽管我非常有信心它展示了gnome-terminal 与 Python 的良好使用——我经常使用它。无论如何,我赞成你的回答,因为它非常好:)
【解决方案2】:

如果您使用的是 Gnome,gnome-terminal 命令在这种情况下非常有用。

作为一个非常基本的用法示例,以下代码将生成一个终端,并在其中运行 Python REPL:

import subprocess

subprocess.Popen(["gnome-terminal", "-e", "python"])

现在,如果你想运行一个特定的脚本,你需要将它的路径与python 连接起来,对于该列表的最后一个元素,它将在新终端中执行。 例如:

subprocess.Popen(["gnome-terminal", "-e", "python my_script.py"])

如果你的脚本是可执行的,你可以省略python:

subprocess.Popen(["gnome-terminal", "-e", "my_script.py"])

如果您想将参数传递给脚本,只需将它们添加到python 命令:

subprocess.Popen(["gnome-terminal", "-e", "python my_script.py var1 var2"])

请注意,如果您想使用特定版本的 Python 运行脚本,则应通过显式调用“python2”或“python3”来指定它。


一个小例子:

# my_script.py
import sys
print(sys.argv)
input()

# main.py
import subprocess
subprocess.Popen(["gnome-terminal", "-e", "python3 my_script.py hello world"])

运行python3 main.py 将生成一个新终端,打印['my_script.py', 'hello', 'world'],并等待输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2021-06-23
    • 2018-09-23
    相关资源
    最近更新 更多