【问题标题】:Environment variables not setting in Python环境变量未在 Python 中设置
【发布时间】:2017-04-28 13:49:24
【问题描述】:

我正在尝试运行需要设置某些环境变量的 python 脚本。我目前正在运行一个 .bat 脚本来设置这些环境变量,然后调用 python 脚本。

我想摆脱 .bat 脚本并在 Python 脚本中设置所需的环境变量。

这就是 .bat 脚本的样子 -

SET OSGEO4W_ROOT=C:\Program Files\QGIS 2.18
SET QGISNAME=qgis
SET QGIS=%OSGEO4W_ROOT%\apps\%QGISNAME%
set QGIS_PREFIX_PATH=%QGIS%

CALL "%OSGEO4W_ROOT%\bin\o4w_env.bat"

set PATH=%OSGEO4W_ROOT%\bin;%QGIS%\bin;%PATH%
SET PYTHONHOME=%OSGEO4W_ROOT%\apps\Python27
set PYTHONPATH=%QGIS%\python;%PYTHONPATH%

python D:\temp\fran\NEW\new.py

这是我试图在 Python 中模仿的方式 -

import os
import subprocess

OSGEO4W_ROOT = r'C:\Program Files\QGIS 2.18'
QGISNAME = r'qgis'
QGIS = r'{}\apps\{}'.format(OSGEO4W_ROOT,QGISNAME)
QGIS_PREFIX_PATH = '{}'.format(QGIS)

bat_command = [r'{}\bin\o4w_env.bat'.format(OSGEO4W_ROOT)]
subprocess.check_call(bat_command)

PATH = os.environ['PATH']
PYTHONPATH = os.environ['PYTHONPATH'] 

os.environ['PATH'] = r'{}\bin;{}\bin;{}'.format(OSGEO4W_ROOT,QGIS,PATH)
os.environ ['PYTHONHOME'] = r'{}\apps\Python27'.format(OSGEO4W_ROOT)
os.environ ['PYTHONPATH'] = r'{}\python;{}'.format(QGIS,PYTHONPATH)

from qgis.core import (QgsProject, QgsComposition, QgsApplication, QgsMapLayerRegistry)

这是我收到的错误消息 -

ImportError: No module named site

当我从 .bat 文件启动脚本时,一切正常。当我在 python 中设置环境变量并运行时,出现导入错误。

有什么想法吗?

【问题讨论】:

  • 如果o4w_env.bat 应该设置所需的环境变量,那么这是行不通的。您将它作为子进程运行,它不能修改其父进程的环境。您可以通过运行命令r'cmd.exe /u /c ""{}\bin\o4w_env.bat" & set"'.format(OSGEO4W_ROOT) 来破解它以使其“工作”。使用subprocess.check_output。解码为'utf-16le',然后解析更新os.environ。或者你也可以将o4w_env.bat 移植到 Python 中,直接修改当前进程。
  • @eryksun 感谢您的回复。我将尝试模仿 o4w_env.bat 在 Python 中所做的事情。
  • 您声明遇到了导入错误,但没有说明错误是什么。
  • @StephenRauch 更新了主体。错误消息是ImportError: No module named site

标签: python batch-file cmd gis qgis


【解决方案1】:

您正在踩踏(不是编辑)PYTHONPATH。在原始批处理文件中,我们有:

set PYTHONPATH=%QGIS%\python;%PYTHONPATH%

请注意,这会将另一个目录添加到路径中。你的代码:

os.environ['PYTHONPATH'] = r'{}\python;'.format(QGIS,PYTHONPATH)

PYTHONPATH。你需要更多类似的东西:

os.environ['PYTHONPATH'] = r'{}\python;'.format(QGIS) + PYTHONPATH

【讨论】:

  • 我发布的代码有误。该声明应该是os.environ ['PYTHONPATH'] = r'{}\python;{}'.format(QGIS,PYTHONPATH)