原作:BRETT CANNON 译者:豌豆花下猫@Python猫 英文:https:///the-many-ways-to-pass-code-to-python-from-the-terminal 大家好,欢迎来到 Crossin的编程教室 ! 我们通常运行程序都是通过IDE里执行运行,有时候也会在命令行通过类似 python hello.py 运行代码。实际上,在命令行中运行python程序还有一些其他的方法。这些方法主要运用在服务器环境上。今天给大家分享一篇文章,来聊一聊你平常可能不会知道的python执行方式。 python news ,它会将 Python 指向我们代码中的'news'目录。前几天,一位合作者问这是如何工作的,似乎我们团队中的每个人都知道如何使用 这使我意识到其他人可能不知道有五花八门的方法可以将 Python 指向要执行的代码,因此有了这篇文章。 1、通过标准输入和管道因为如何用管道传东西给一个进程是属于 shell 的内容,我不打算深入解释。毋庸置疑,你可以将代码传递到 Python 中。
如果将文件重定向到 Python,这显然也可以。 # 重定向一个文件给 python 归功于 Python 的 UNIX 传统,这些都不太令人感到意外。 2、通过 -c 指定的字符串如果你只需要快速地检查某些内容,则可以在命令行中将代码作为字符串传递。
当需要检查仅一行或两行代码时,我个人会使用它,而不是启动 REPL(译注:Read Eval Print Loop,即交互式解释器,例如在 windows 控制台中输入 3、文件的路径最众所周知的传代码给 python 的方法很可能是通过文件路径。 # 指定 python 的文件路径 要实现这一点的关键是将包含该文件的目录放到 4、对包使用 -m执行 Python 包的正确方法是使用 -m 并指定要运行的包名。
它在底层使用了runpy[5]。要在你的项目中做到这点,只需要在包里指定一个 我知道有些人喜欢在一个包里写一个 from . import main 就我个人而言,我不感冒于单独的 (译注:即作者不关心作为入口文件的'main'或者“__main__”模块,因为执行时只需用它们的包名即可。我认为这也暗示了入口模块不该再被其它模块 import) 5、目录定义 现在你可能会问:“为什么不直接指定文件路径呢?”好吧,坦白说,关于文件路径,有件事得说清楚。😄在发布过程中,我可以简单地写上说明,让运行 再加上我以后可以更改文件名,而且没人会注意到。再加上我知道代码会带有辅助文件,因此将其放在目录中而不是单独作为单个文件是有意义的。 当然,我也可以将它变为一个使用 -m 的包,但是没必要,因为 announce 脚本很简单,我知道它要保持成为一个单独的自足的文件(少于 200 行,并且测试模块也大约是相同的长度) 况且,
现在显然必须要处理依赖关系,但是如果你的脚本仅使用标准库或将依赖模块放在 (译注:我觉得作者在此有点“炫技”了,因为这种写法的前提是得知道 runpy 的用法,但是就像前一条所写的用 -m 参数运行一个包,在底层也是用了 runpy。不过炫技的好处也非常明显,即 6、执行一个压缩文件如果你确实有多个文件和/或依赖模块,并且希望将所有代码作为一个单元发布,你可以用一个 # 将一个压缩包传给 Python 人们现在习惯上用 .pyz 文件扩展名来命名此类压缩文件,但这纯粹是传统,不会影响任何东西;你当然也可以用 .zip 文件扩展名。 为了简化创建此类可执行的压缩文件,标准库提供了zipapp[7]模块。它会为你生成 不幸的是,仅当压缩文件包含的所有代码都是纯 Python 时,才能这样运行压缩文件。执行压缩文件对扩展模块无效(这就是为什么 setuptools 有一个 zip_safe[8]标志的原因)。(译注:扩展模块 extension module,即 C/C 之类的非 Python 文件) 要加载扩展模块,Python 必须调用 dlopen()[9]函数,它要传入一个文件路径,但当该文件路径就包含在压缩文件内时,这显然不起作用。 我知道至少有一个人与 glibc 团队交谈过,关于支持将内存缓冲区传入压缩文件,以便 Python 可以将扩展模块读入内存,并将其传给压缩文件,但是如果内存为此服务,glibc 团队并不同意。 但是,并非所有希望都丧失了!你可以使用诸如shiv[10]之类的项目,它会捆绑(bundle)你的代码,然后提供一个 |
|
来自: 闲野之家 > 《Python 入门》