3. 編寫設置腳本的配置文件?

備注

這篇文檔是歷史遺留文檔,在 https://setuptools.readthedocs.io/en/latest/setuptools.html 上的 setuptools 文檔獨立涵蓋此處包含的所有相關信息之后,將不再單獨作為正式文檔保留。

通常,在 事前 就寫出構建發(fā)布包所需的一切是不可能的:你可能需要從用戶或者用戶的系統(tǒng)獲取一些信息,才能繼續(xù)下去。 只要這些信息相當簡單 —— 例如一個用于搜索 C 頭文件或庫的目錄列表 —— 那么提供配置文件 setup.cfg 供用戶配置就是一個低成本且方便的解決方式。 配置文件還允許你為任何命令選項提供默認值,而安裝器可以通過命令行或編輯配置文件來覆蓋這些默認值。

安裝配置文件是在安裝腳本和安裝腳本命令行之間一個適當?shù)恼壑苑绞?--- 安裝腳本在理想情況下應當不受安裝者的控制 1 --- 而安裝腳本命令行則在你的控制范圍之外且完全取決于安裝者的選擇。 實際上,setup.cfg (以及目標系統(tǒng)上的其他任何 Distutils 配置文件) 是在配置腳本之后、命令行之前被處理。 這導致了幾個有用的后果:

  • 安裝者可以通過編輯 setup.cfg 來覆蓋你放在 setup.py 中的配置

  • 你可以為無法在 setup.py 中方便設置的選項提供非標準的默認值

  • 安裝者可以使用 setup.py 的命令行選項來覆蓋 setup.cfg 中的一切

配置文件的基本語法很簡單:

[command]
option=value
...

其中 command 是一個 Distutils 命令 (例如 build_py, install),而 option 是該命令所支持的某個選項。 可以為每個命令提供任意數(shù)量的選項,并且可以在文件中包括任意數(shù)量的命令組。 空白行會被忽略,以一個 '#' 開始的注釋行也是如此。 長選項值可以簡單地通過縮進后續(xù)行的方式被拆分為多行。

你可以用通用的 --help 選項找出特定命令所支持的選項列表,例如

$ python setup.py --help build_ext
[...]
Options for 'build_ext' command:
  --build-lib (-b)     directory for compiled extension modules
  --build-temp (-t)    directory for temporary files (build by-products)
  --inplace (-i)       ignore build-lib and put compiled extensions into the
                       source directory alongside your pure Python modules
  --include-dirs (-I)  list of directories to search for header files
  --define (-D)        C preprocessor macros to define
  --undef (-U)         C preprocessor macros to undefine
  --swig-opts          list of SWIG command line options
[...]

請注意在命令行中拼寫為 --foo-bar 的選項在配置文件中會拼寫為 foo_bar。

例如,假設你希望你的擴展在“原地”構建 --- 就是說你有一個擴展 pkg.ext,你希望編譯出的擴展文件 (例如在 Unix 上為 ext.so) 放在與你的純 Python 模塊 pkg.mod1pkg.mod2 相同的源目錄中。 你總是可以在命令行中使用 --inplace 選項來確保這一點:

python setup.py build_ext --inplace

但是這要求你總是顯式地指定 build_ext 命令,并且記得提供 --inplace。 一個更容易的方式是通過將其編碼在此發(fā)布包的配置文件 setup.cfg 中,“設置并忘記”該選項。

[build_ext]
inplace=1

這將影響此模塊發(fā)布包的所有構建,不論你是否顯式指定 build_ext。 如果你在你的源發(fā)布包中包括了 setup.cfg,它還將影響最終用戶的構建 --- 對此選項來說這可能不是個好主意,因為總是原地構建擴展會破壞模塊發(fā)布包的安裝。 不過在某些特殊情況下,模塊是在其安裝目錄中被構建的,因此這可能會是個有用的功能。 (但是,發(fā)布預期在其安裝目錄中被構建的擴展幾乎總是一個壞主意。)

另一個例子:特定的命令會接受許多在多次運行中都不發(fā)生變化的選項;例如,bdist_rpm 需要知道為創(chuàng)建 RPM 發(fā)布包生成 "spec" 文件所要求的所有信息。 這些信息有的來自安裝腳本,有的由 Distutils 自動生成(例如已安裝文件列表)。 但有的則必須作為 bdist_rpm 的選項提供,每次運行時都在命令行中完成將會非常繁瑣。 因此,這里提供 Distutils 本身的 setup.cfg 中的一段代碼:

[bdist_rpm]
release = 1
packager = Greg Ward <gward@python.net>
doc_files = CHANGES.txt
            README.txt
            USAGE.txt
            doc/
            examples/

請注意 doc_files 選項只是一個空格分隔以提高可讀性的多行字符串。

參見

"安裝 Python 模塊" 中的 Syntax of config files

有關配置文件的更多信息可在系統(tǒng)管理員手冊中查看。

備注

1

在 Distutils 完全支持自動配置之前,這一理想可能是無法實現(xiàn)的。