Python 检查Sphinx文档是否调用了脚本

Python 检查Sphinx文档是否调用了脚本,python,python-sphinx,arcpy,Python,Python Sphinx,Arcpy,我目前正在尝试为使用ArcGIS arcpy库的脚本生成sphinx文档 当sphinx试图在生成文档时运行脚本时,我遇到了一个问题,因为arcpy脚本从arcgis gui获取输入参数。由于sphinx在不使用gui的情况下调用脚本,因此这些参数为空,并导致如下回溯: C:\VersionControl\PythonScripts\Source\src\_build\script_export_pdf.rst:4: WARNING: autodoc: failed to import

我目前正在尝试为使用ArcGIS arcpy库的脚本生成sphinx文档

当sphinx试图在生成文档时运行脚本时,我遇到了一个问题,因为arcpy脚本从arcgis gui获取输入参数。由于sphinx在不使用gui的情况下调用脚本,因此这些参数为空,并导致如下回溯:

C:\VersionControl\PythonScripts\Source\src\_build\script_export_pdf.rst:4: WARNING:     autodoc: failed to import module u'gis.scripts.script_export_pdf'; the following exception was raised:
Traceback (most recent call last):
  File "C:\VersionControl\PythonScripts\Source\src\lib\Python27\ArcGIS10.1\lib\site-packages\sphinx\ext\autodoc.py", line 335, in import_object
    __import__(self.modname)
  File "C:\VersionControl\PythonScripts\Source\src\gis\scripts\script_export_pdf.py", line 76, in <module>
    mxd.ExportToPDF(in_mxds, out_folder, overwrite, current)
  File "C:\VersionControl\PythonScripts\Source\src\gis\mapping\mxd.py", line 315, in ExportToPDF
    _ExportToPDF(arcpy.mapping.MapDocument(m), out_folder, overwrite)
  File "C:\Program Files (x86)\ArcGIS\Desktop10.1\arcpy\arcpy\arcobjects\mixins.py", line 609, in __init__
    assert (os.path.isfile(mxd) or (mxd.lower() == "current")), gp.getIDMessage(89004, "Invalid MXD filename")
AssertionError: Invalid MXD filename.
C:\VersionControl\PythonScripts\Source\src\\u build\script\u export\u pdf.rst:4:警告:autodoc:无法导入模块u'gis.scripts.script\u export\u pdf';引发了以下异常:
回溯(最近一次呼叫最后一次):
文件“C:\VersionControl\PythonScripts\Source\src\lib\Python27\ArcGIS10.1\lib\site packages\sphinx\ext\autodoc.py”,第335行,在导入对象中
__导入(self.modname)
文件“C:\VersionControl\PythonScripts\Source\src\gis\scripts\scripts\script\u export\u pdf.py”,第76行,在
ExportToPDF(in_mxds,out_文件夹,覆盖,当前)
ExportToPDF中的文件“C:\VersionControl\PythonScripts\Source\src\gis\mapping\mxd.py”,第315行
_ExportToPDF(arcpy.mapping.MapDocument(m),out\u文件夹,覆盖)
文件“C:\Program Files(x86)\ArcGIS\Desktop10.1\arcpy\arcpy\arcobjects\mixins.py”,第609行,在\uuu init中__
断言(os.path.isfile(mxd)或(mxd.lower()=“当前”)、gp.getIDMessage(89004,“无效的mxd文件名”)
AssertionError:MXD文件名无效。

在unittests中,我通过在测试开始时设置一个变量来解决这个问题,脚本会检查该变量并在参数中设置测试值,我想知道sphinx是否也有类似的解决方法?

我提出的解决方案,虽然可能不太理想,但就是简单地检查

if 'sphinx' in sys.modules:
    in_mxds = [r"C:/test.mxd"]
else:
    in_mxds = arcpy.GetParameterAsText(1)

这将确保脚本不会试图从GUI获取生成sphinx文档时未设置的参数

如果您的项目正在导入
sphinx
(在我的例子中是sphinx扩展),以下内容也可能适用于您

import os
import sys
if os.path.basename(sys.argv[0]) == "sphinx-build":
    # code for when sphinx is running
else:
    # code for regular application
我不确定这是否适用于Windows,或者它是否应该是类似的

if os.path.basename(sys.argv[0]) in ["sphinx-build", "sphinx-build.exe"]:

自Sphinx1.3以来,这个问题有一个简单的解决方案。加上

autodoc_mock_imports = ['arcpy']
到您的conf.py。当某些外部依赖项在构建时未得到满足并中断构建过程时,可以使用此选项。 看


不幸的是,Esri的arcpy文档非常糟糕,并且大多忽略了Python标准。

我这样做。在我的
conf.py
中,我向
内置模块添加了一个新变量,如下所示:

导入任何模块之前,在conf.py中的任何位置 进口内置设备 内置。\狮身人面像\建筑\正确
然后在我的模块代码中,我可以写一个检查,如:

试试看:
从某个依赖项导入某个类
除恐怖外:
尝试:
如果狮身人面像建造:
类SomeClass:
“模仿班级”
除名称错误外:
引发导入错误(“某些依赖项”)

对于大多数项目来说,这是一个非常好的技巧!不幸的是,如果您正在记录sphinx扩展,它将无法工作:/