【问题标题】:Start a QProcess with PYTHONPATH set to different python version启动一个 QProcess 并将 PYTHONPATH 设置为不同的 python 版本
【发布时间】:2013-08-31 15:21:27
【问题描述】:

我已经使用 python 3.3 和 Qt4.8 创建了一个 PyQt 应用程序,我正在从它开始一个 QProcess。新启动的子进程尝试运行 python 脚本,该脚本失败,因为它在 3.3 目录中搜索 python 模块(系统上的默认 python 为 2.7)。

我认为它正在 python 3.3 目录中搜索 python 模块,因为子进程从父进程继承其环境(因此 PYTHONPATH)。我可以使用 QProcess.setProcessEnvironment 更改 PYTHONPATH,但是如何在使用 python 3.3 的 PyQt 应用程序中获取 2.7 的 PYTHONPATH 值?

编辑: Viktor 下面的答案对我有用。我需要从环境中删除 PYTHONPATH 和 PYTHONHOME。我需要删除 PYTHONHOME 因为否则启动器正在从我的应用程序的本地目录中使用(我使用 py2app 创建了应用程序/包)。下面是代码:

systemEnvironment = QtCore.QProcessEnvironment.systemEnvironment()
systemEnvironment.remove( 'PYTHONPATH' )
systemEnvironment.remove( 'PYTHONHOME' )
process.setProcessEnvironment( systemEnvironment )

【问题讨论】:

  • 将有问题的代码部分添加到问题中。
  • 过程 = QProcess(self); process.start("perl abc.pl"); trun 中的这个 abc.pl 调用了另一个 python 脚本,我需要在 PYTHONPATH 设置为搜索 2.7 环境的情况下调用它(当前脚本在 python 3.3 中运行)。

标签: python python-2.7 python-3.x pythonpath qprocess


【解决方案1】:
# Get the current environment end filter out the old
# PYTHONPATH variable if exists in the environment
env = [env for env in QtCore.QProcess.systemEnvironment()
       if not env.startswith('PYTHONPATH=')]
# Add your PYTHONPATH
env.append('PYTHONPATH=path_to_where_you_want')
# Create a process, set the environment and run the script
p = QtCore.QProcess()
p.setEnvironment(env)
p.start('perl abc.pl')

如果您希望子进程 python 恢复为默认的PYTHONPATH,只需从环境中删除当前的子进程(跳过env.append 部分)

【讨论】:

  • 如何找到默认 python 环境的路径(我在终端的 python 解释器中使用 sys.path 获得的路径)。
  • 您只需从环境变量中删除 PYTHONPATH,Python 将回退到它的默认值。
  • 感谢您的回复。我会试一试的。
  • 我也在使用 QtGui.QDesktopServices.openUrl(QtCore.QUrl.fromLocalFile(path))。有没有办法通过这个调用为新启动的程序编辑环境?
  • @Gaurav 我认为没有。至少我在 API 文档中没有看到。
猜你喜欢
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多