在另一个 XTERM 会话中启动 Python 脚本



这行代码让我陷入困境。 我已经阅读了许多在新终端窗口中启动 python 脚本的方法。 我想我与这句话非常接近,但它似乎在我的道路上窒息了。

代码行为:

os.system("xterm -hold 'sudo python /home/pi/newcode/newcode/hms2-v2.5.py'")

错误消息是:

xterm: no absolute path found for shell: sudo python /home/pi/newcode/newcode/hms2-v2.5.py

它告诉你真相。 当你运行xterm <thing>时,xterm会尝试在你的$PATH中找到一个名为<thing>的二进制文件。 在这种情况下,您已经传递了一个带引号的长字符串,但它仍然是单个参数,可以预见的是xterm找不到它。

对于您要做的事情,您需要-e选项。从手册页:

-e program [ arguments ... ]
This option specifies the program (and its command line arguments) to be run in the xterm window.  It also sets
the window title and icon name to be the basename of the program being executed if neither -T nor -n are given on
the command line.

所以:

os.system("xterm -hold -e sudo python /home/pi/newcode/newcode/hms2-v2.5.py")
subprocess.Popen(['xterm', '-e', 'bash -c "python pythonFile.py; exec bash"'])

如前所述,您应该使用-e选项:

-e 程序 [ 参数 ... ]
此选项指定程序(及其命令行) 参数),将在 XTERM 窗口中运行。 它还设置 窗口标题和图标名称作为程序的基本名称 如果命令上既没有给出 -T 也没有给出 -n,则执行 线。
注意:这必须是命令行上的最后一个选项

手册页中有一个微妙的点:当你省略-e时,xterm 试图将整个带引号的字符串解释为 shell 解释器的名称。 这是间接的,因为它实现localFilter的方式:

使用区域设置过滤器时,例如,带有-e选项,或 shell,xterm首先尝试通过该过滤器传递控制权。 如果 失败,xterm 将在没有区域设置过滤器的情况下重试。 Xterm 在重试之前警告失败。

在"选项"部分的开头还有一些额外的讨论:

可以给出一个参数(在所有选项之后)。 这覆盖了 xterm 的 内置外壳程序选择:

  • 如果参数不是相对路径,即以"./"或 "../",xterm 在用户的 PATH 中查找文件。 无论哪种情况, 如果 XTERM 无法构造绝对路径,则此检查将失败。

所以... 当你尝试时

os.system("xterm -hold 'sudo python /home/pi/newcode/newcode/hms2-v2.5.py'")

xterm 尝试查找名为

sudo python /home/pi/newcode/newcode/hms2-v2.5.py

这不是你的意图。

最新更新