> For the complete documentation index, see [llms.txt](https://hai-shi.gitbook.io/cpython-internals/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hai-shi.gitbook.io/cpython-internals/6-configuration-and-input.md).

# 六、配置和输入

现在你已经了解了 Python 的语法，是时候探索一下代码是如何进入可执行状态的了。

在 CPython 中运行 Python 代码的方式有很多，下面是一些最常用的方法：

1. 通过 `python -c` 命令加一个 Python 字符串来运行；
2. 通过 `python -m` 命令加一个模块名称来运行；
3. 通过 `python <file>` 运行，其中 <`file>` 为文件的具体路径，并且文件中包含 Python 代码；
4. 通过标准输入将 Python 代码通过管道传输到可执行文件中，例如 `cat <file> | python`；
5. 通过启动交互式解释器（REPL）并一次执行一个命令；
6. 使用 C API，并用 Python 作为嵌入式环境。

{% hint style="info" %}
**参见**

Python 有这么多执行脚本的方法，信息量比较大可能一时难以消化。有关运行 Python 脚本的更多信息，请查看 Real Python 的“如何运行 Python 脚本”。
{% endhint %}

为了执行任何的 python 代码，解释器需要三个要素到位：

* 一个要执行的模块；
* 用于保存变量等信息的状态；
* 配置项，例如开启了哪些选项。

有了这三个组件，解释器就可以执行代码并且输出 ：

![图6.1 CPython解释器三个模块](/files/kayRzjNgDlwp4bNxgmLy)

{% hint style="info" %}
**注**

与 Python 的编码规范 [PEP 8](https://realpython.com/courses/writing-beautiful-python-code-pep-8/) 类似，CPython 中 C 代码的编码规范叫做 [PEP 7](https://peps.python.org/pep-0007/)。它包括以下 C 源代码的命名标准：

* 公共函数使用 `Py` 前缀，静态函数则不使用 `Py` 前缀。
* `Py_` 前缀是为全局服务例行程序保留的，如：`Py_FatalError`。特定的例行程序组（如特定对象类型的 API）使用更长的前缀，如：字符串函数会使用 `PyString_` 前缀。
* 公共函数和变量的命名规则是大小写混写、单词应由下划线分隔，如：`PyObject_GetAttr()`、`Py_BuildValue()`、`PyExc_TypeError()` 。
* `_Py` 前缀应保留给需要对加载器可见的内部函数，如：`_PyObject_Dump()`。
* 宏的前缀是大小写混合的，之后的部分使用大写字母，所有单词由下划线分隔，如：`PyString_AS_STRING`，`Py_PRINT_RAW`。

与 PEP 8 不同的是，用于检查 PEP 7 合规性的工具很少。因此这部分合规性的检查任务就需要通过核心开发者参与到代码检视中来完成。与其他任何人工操作的流程一样，这种类型的审查不是防错的，所以你很可能会发现不符合 PEP 7 的代码。

唯一用来自动化检查 PEP7 合规性的工具是一个名为 `smelly.py` 的脚本，你可以在 Linux 或 macOS 上通过 `make smelly` 执行，或通过以下命令行执行：

```bash
$ ./python Tools/scripts/smelly.py
```

一旦发现任何属于 `libpython` （共享CPython库）的不以 `Py` 或 `_Py` 开头的符号，脚本就会报错。
{% endhint %}
