不确定这是否可能。我有一组 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 运行的脚本?
乌班图16
谢谢:)
Popen 不会加载您在 python 脚本中创建的会话的系统 PATH。您必须修改会话中的 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,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']
,并等待输入。