【发布时间】:2014-02-04 16:41:51
【问题描述】:
我想从 python 脚本中调用一个单独的非子 python 程序,并让它在新的 shell 实例中外部运行。原始的 python 脚本不需要知道它启动的实例,它不应该在启动的进程运行时阻塞,也不应该关心它是否死亡。这是我尝试过的,它没有返回错误,但似乎什么也没做......
import subprocess
python_path = '/usr/bin/python'
args = [python_path, '&']
p = subprocess.Popen(args, shell=True)
我应该做些什么不同
编辑
这样做的原因是我有一个内置 python 版本的应用程序,我已经编写了一些 python 工具,应该与这个应用程序一起单独运行,但不能保证用户会在他们的系统上安装 python在我正在使用的内置版本的应用程序之外。因此,我可以通过编程方式从内置版本中获取 python 二进制路径,并且我想启动内置 python 的外部版本。这消除了用户自己安装 python 的需要。所以本质上我需要一种简单的方法来使用我当前运行的python版本以编程方式调用外部python脚本。
我不需要将任何输出捕获到原始程序中,实际上一旦启动我希望它与原始程序无关
编辑 2
所以看来我最初的问题很不清楚,所以这里有更多细节,我想我试图过度简化问题:
我正在运行 OSX,但代码也应该可以在 Windows 机器上运行。
具有内置 CPython 版本的主应用程序是一个已编译的 C++ 应用程序,它附带一个在运行时使用的 Python 框架。您可以通过在 OSX 上的终端窗口中执行此操作来启动此版本 python 的嵌入式版本
/my_main_app/Contents/Frameworks/Python.framework/Versions/2.7/bin/python
从我的主应用程序中,我希望能够在嵌入在主应用程序中的 python 版本中运行一个命令,该命令使用上述 python 版本启动 python 脚本的外部副本,就像我这样做一样在终端窗口中执行以下命令。新启动的孤立进程应该有自己的终端窗口,以便用户可以与之交互。
/my_main_app/Contents/Frameworks/Python.framework/Versions/2.7/bin/python my_python_script
我希望子 python 实例不要阻塞主应用程序,并且我希望它有自己的终端窗口,以便用户可以与之交互。一旦以任何方式启动,主应用程序不需要知道孩子。我这样做的唯一原因是使用终端为用户自动启动外部应用程序
【问题讨论】:
-
你这样做是为了什么?如果你解释了这一点,那么解释如何做你真正想做的事情会更容易。
-
附带说明,“以编程方式从内置版本获取 python 二进制路径”的方法是
sys.executable。 -
@abarnert 我实际上试过了,但在这种情况下它并不那么简单,因为 python 嵌入到另一个应用程序中,这个命令返回到“主”进程的路径,在这种情况下不是一个python实例
-
您的编辑 still 并没有说您要运行 一个新的终端窗口,然后在该窗口内运行 Python。由于这就是问题的全部重点,而且问题中的任何地方都没有提到它,因此您需要再次对其进行编辑。
-
如果您实际运行嵌入在其他 C 程序中的 Python,则可能没有 Python 可执行文件,或者它可能无法正常工作。如果你只关心一个特定的应用程序,它恰好有一个可用的普通 Python 可执行文件,那很好......