当前位置: 首页 > 编程日记 > 正文

涨见识了,在终端执行 Python 代码的 6 种方式

作者 | BRETT CANNON
译者 | 豌豆花下猫@Python猫

为了我们推出的 VS Code 的 Python 插件[1],我写了一个简单的脚本来生成变更日志[2](类似于Towncrier[3],但简单些,支持 Markdown,符合我们的需求)。在发布过程中,有一个步骤是运行python news,它会将 Python 指向我们代码中的"news"目录。

前几天,一位合作者问这是如何工作的,似乎我们团队中的每个人都知道如何使用-m?请参阅我的有关带 -m 使用 pip 的文章[4],了解原因。

这使我意识到其他人可能不知道有五花八门的方法可以将 Python 指向要执行的代码,因此有了这篇文章。

通过标准输入和管理

因为如何用管道传东西给一个进程是属于 shell 的内容,我不打算深入解释。毋庸置疑,你可以将代码传递到 Python 中。

# 管道传内容给 python
echo "print('hi')" | python

如果将文件重定向到 Python,这显然也可以。

# 重定向一个文件给 python
python < spam.py

归功于 Python 的 UNIX 传统,这些都不太令人感到意外。

通过 -c 指定的字符串

如果你只需要快速地检查某些内容,则可以在命令行中将代码作为字符串传递。

# 使用 python 的 -c 参数
python -c "print('hi')"

当需要检查仅一行或两行代码时,我个人会使用它,而不是启动 REPL(译注:Read Eval Print Loop,即交互式解释器,例如在 windows 控制台中输入python, 就会进入交互式解释器。-c 参数用法可以省去进入解释器界面的过程)

文件的路径

最众所周知的传代码给 python 的方法很可能是通过文件路径。

# 指定 python 的文件路径
python spam.py

要实现这一点的关键是将包含该文件的目录放到sys.path里。这样你的所有导入都可以继续使用。但这也是为什么你不能/不应该传入包含在一个包里的模块路径。因为sys.path可能不包含该包的目录,因此所有的导入将相对于与你预期的包不同的目录。

对包使用 -m

执行 Python 包的正确方法是使用 -m 并指定要运行的包名。

python -m spam

它在底层使用了runpy[5]。要在你的项目中做到这点,只需要在包里指定一个__main__.py文件,它将被当成__main__执行。而且子模块可以像任何其它模块一样导入,因此你可以对其进行各种测试。

我知道有些人喜欢在一个包里写一个main子模块,然后将其__main__.py写成:

from . import mainif __name__ == "__main__":main.main()

就我个人而言,我不感冒于单独的main模块,而是直接将所有相关的代码放入__main__.py,因为我感觉这些模块名是多余的。

(译注:即作者不关心作为入口文件的"main"或者“main”模块,因为执行时只需用它们的包名即可。我认为这也暗示了入口模块不该再被其它模块 import。我上篇文章 [6]比作者的观点激进,认为连那句 if 语句都不该写。)

目录

定义__main__.py也可以扩展到目录。如果你看一下促成此博客文章的示例,python news可执行,就是因为 news 目录有一个 __main__.py文件。该目录就像一个文件路径被 Python 执行了。

img

现在你可能会问:“为什么不直接指定文件路径呢?”好吧,坦白说,关于文件路径,有件事得说清楚。????在发布过程中,我可以简单地写上说明,让运行python news/announce.py,但是并没有确切的理由说明这种机制何时存在。

再加上我以后可以更改文件名,而且没人会注意到。再加上我知道代码会带有辅助文件,因此将其放在目录中而不是单独作为单个文件是有意义的。

当然,我也可以将它变为一个使用 -m 的包,但是没必要,因为 announce 脚本很简单,我知道它要保持成为一个单独的自足的文件(少于 200 行,并且测试模块也大约是相同的长度)

况且,__main__.py文件非常简单。

import runpy
# Change 'announce' to whatever module you want to run.
runpy.run_module('announce', run_name='__main__', alter_sys=True)

现在显然必须要处理依赖关系,但是如果你的脚本仅使用标准库或将依赖模块放在__main__.py旁边(译注:即同级目录),那么就足够了!

(译注:我觉得作者在此有点“炫技”了,因为这种写法的前提是得知道 runpy 的用法,但是就像前一条所写的用 -m 参数运行一个包,在底层也是用了 runpy。不过炫技的好处也非常明显,即__main__.py 里不用导入 announce 模块,还是以它为主模块执行,也就不会破坏原来的依赖导入关系)

执行一个压缩文件

如果你确实有多个文件和/或依赖模块,并且希望将所有代码作为一个单元发布,你可以用一个__main__.py,放置在一个压缩文件中,并把压缩文件所在目录放在 sys.path 里,Python 会替你运行__main__.py文件。

# 将一个压缩包传给 Python
python app.pyz

人们现在习惯上用 .pyz 文件扩展名来命名此类压缩文件,但这纯粹是传统,不会影响任何东西;你当然也可以用 .zip 文件扩展名。

为了简化创建此类可执行的压缩文件,标准库提供了zipapp[7]模块。它会为你生成__main__.py并添加一条组织行(shebang line),因此你甚至不需要指定 python,如果你不想在 UNIX 上指定它的话。如果你想移动一堆纯 Python 代码,这是一种不错的方法。

不幸的是,仅当压缩文件包含的所有代码都是纯 Python 时,才能这样运行压缩文件。执行压缩文件对扩展模块无效(这就是为什么 setuptools 有一个 zip_safe[8]标志的原因)。(译注:扩展模块 extension module,即 C/C++ 之类的非 Python 文件)

要加载扩展模块,Python 必须调用 dlopen()[9]函数,它要传入一个文件路径,但当该文件路径就包含在压缩文件内时,这显然不起作用。

我知道至少有一个人与 glibc 团队交谈过,关于支持将内存缓冲区传入压缩文件,以便 Python 可以将扩展模块读入内存,并将其传给压缩文件,但是如果内存为此服务,glibc 团队并不同意。

但是,并非所有希望都丧失了!你可以使用诸如shiv[10]之类的项目,它会捆绑(bundle)你的代码,然后提供一个__main__.py来处理压缩文件的提取、缓存,然后为你执行代码。尽管不如纯 Python 解决方案理想,但它确实可行,并且在这种情况下算得上是优雅的。

原文链接:https://snarky.ca/the-many-ways-to-pass-code-to-python-from-the-terminal

推荐阅读
  • 性能超越最新序列推荐模型,华为诺亚方舟提出记忆增强的图神经网络

  • 阿里云科学家入选计算机顶会HPCA名人堂,他是什么来头?

  • 干货 | 基于SRS直播平台的监控系统之实现思路与过程

  • DevOps 在移动应用程序开发中扮演什么角色?

  • 又一国产数据库诞生!腾讯发布 TGDB,实时查询比 Neo4j 快 20-150 倍!

  • 稳定币经济:十大稳定币简史

你点的每个“在看”,我都认真当成了AI

相关文章:

ASP.NET中DataGrid鼠标经过感知以及点击行弹出窗口

选择自 xujh 的 Blog 作者Blog&#xff1a;http://blog.csdn.net/xujh/ 很多人说很难&#xff0c;其实就这几行代码。只要在DataGrid1的ItemDataBound中写入下代码即可 private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventAr…

python中的module

Python中的Module是比较重要的概念。常见的情况是&#xff0c;事先写好一个.py文件&#xff0c;在另一个文件中需要import时&#xff0c;将事先写好的.py文件拷贝到当前目录&#xff0c;或者是在sys.path中增加事先写好的.py文件所在的目录&#xff0c;然后import。这样的做法&…

找子串替换(kmp)poj1572

题目链接&#xff1a;http://poj.org/problem?id1572 输入数据时要注意&#xff0c;这里是string型 用getline(cin,origin[i]); #include <string> #include <iostream> #include <algorithm> #include <stdio.h>using namespace std;const int maxn …

dll的概念、dll导出类(转)

1、 DLL的概念DLL(Dynamic Linkable Library)&#xff0c;动态链接库&#xff0c;可以向程序提供一些函数、变量或类。这些可以直接拿来使用。静态链接库与动态链接库的区别&#xff1a;&#xff08;1&#xff09;静态链接库与动态链接库都是共享代码的方式。静态链接库把最后的…

墨奇科技汤林鹏:如何用 AI 技术颠覆指纹识别?

受访者 | 墨奇科技联合创始人& CTO 汤林鹏 记者 | Aholiab&#xff0c;编辑 | Carol 出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 随着深度学习等AI技术的成熟&#xff0c;生物识别成为了关注度较高的领域&#xff0c;指纹、人脸、虹膜等识别技术…

ASP.Net ViewState的实现

选择自 timmy3310 的 Blog ViewState是.Net中提出的状态保存的一种新途径&#xff08;实际上也是老瓶装新酒&#xff09;&#xff1b;我们知道&#xff0c;传统的Web程序保存状态的方式有这样几种&#xff1a;1、Application 这是Web应用程序生命期中的全局保存区&#xff0c…

【51CTO学院三周年】遇到

作为一名二流学校的大学生&#xff0c;因为学校的一门嵌入式Linux应用程序开发而喜欢上了嵌入式&#xff0c;但是学校却是只上了一学期的课&#xff0c;无奈只能自己找教程继续学习。在3个月前&#xff0c;无意中找到了朱有鹏老师的嵌入式学习基础视频&#xff0c;通过老师视频…

ASP.NET图象处理详解

作者&#xff1a;未知 请与本人联系在使用ASP的时候&#xff0c;我们时常要借助第三方控件来实现一些图象功能。而现在&#xff0c;ASP.NET的推出&#xff0c;我们已经没有必要再使用第三方控件来实现&#xff0c;因为ASP.NET 已经具有强大的功能来实现一些图象处理。现在&…

IT工作者,你们的爱情是这样的吗?

今天在博客里看到了这篇文章&#xff0c;看完这个视频我随笔写了点自己的感受和看法&#xff0c; 视频链接在下方&#xff1a; http://leidu.blog.51cto.com/3245712/622534 很感谢90 男孩提供&#xff0c;建议IT人员看一下&#xff0c;看完写一下你们的感受吧&#xff01;…

平头哥玄铁处理器Linux新版本,5大亮点速览

来源 | 芯片开放社区为了便于 CPU 评估&#xff0c;系统集成&#xff0c;快速上手玄铁处理器 Linux 操作系统&#xff0c;平头哥更新了玄铁处理器 linux 版本&#xff0c;结合 gitlab 开源 CI/CD 系统&#xff0c;对已发布到开源社区的玄铁架构 CPU 相关的生态软件形成持续保障…

费用保险单,如何失焦时自动补零

费用&#xff0c;如何失焦时自动补零转载于:https://www.cnblogs.com/maojiayan/p/5606247.html

腾讯AI种番茄双丰收:参赛AI全胜专家,辽宁试点净利增千元

6月9日&#xff0c;腾讯宣布了两项AI农业领域进展。在研究侧&#xff0c;腾讯 AI Lab 与荷兰瓦赫宁根大学&#xff08;下称WUR&#xff09;联办的“第二届国际智慧温室种植挑战赛”&#xff08;下称比赛&#xff09;落幕。在全球疫情肆虐之时&#xff0c;复赛的五支队伍挑战用 …

在ASP.NET中值得注意的两个地方

在ASP.NET中ASPX页面的Page_Load事件有两个让人奇怪的地方&#xff0c;你应该记住它们&#xff1a; a.有时Page_Load事件在你的ASP.NET页面里会发生多次。这种情况发生的一个可能的原因是你把ASPX页面的AutoEvenWireup值设置成了True。如果是这样&#xff0c;那么在“Sub Page…

yii 级联删除

alter table 外键表 add constraint 级联删除名 foreign key (外键字段) references 主表名(主表字段)ON delete CASCADE go 转载于:https://blog.51cto.com/dasangshu/624605

iOS--优秀博客记录

感谢唐巧整理&#xff0c;我又加了一些备注。原地址&#xff1a;https://github.com/tangqiaoboy/iOSBlogCN 博客地址RSS地址psOneVs Denhttp://onevcat.com/atom.xml 一只魔法师的工坊http://blog.ibireme.com/feed/图片处理、YYKit破船之家http://beyondvincent.com/atom.xml…

linux环境下和网络服务相关的配置文件含义及如何配置

要建立一个安全Linux服务器就首先要了解Linux环境下和网络服务相关的配置文件的含义及如何进行安全的配置。那天查看服务器的eth0地址&#xff0c;后来想了一些问题&#xff0c;到家里就翻了翻以前的文档&#xff0c;无意中看到了这个&#xff0c;现在发布出来&#xff0c;希望…

ASP.NET保持用户状态的九种选择

2003-06-10 ■陶刚编译 ■yesky摘要&#xff1a;ASP.NET为保持用户请求之间的数据提供了多种不同的途径。你可以使用Application对象、cookie、hidden fields、Sessions或Cache对象&#xff0c;以及它们的大量的方法。决定什么时候使用它们有时很困难。本文将介绍了上述的技术&…

Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

作者 | 杨秀璋&#xff0c;责编 | 夕颜 题图 | 视觉中国出品 | CSDN博客本篇文章主要讲解Python调用OpenCV实现图像平滑&#xff0c;包括四个算法&#xff1a;均值滤波、方框滤波、高斯滤波和中值滤波。全文均是基础知识&#xff0c;希望对您有所帮助。知识点如下&#xff1a;…

Laravel Lumen之Eloquent ORM使用速查-基础部分

使用Eloquent [eləkwənt] 时&#xff0c;数据库查询构造器的方法对模型类也是也用的&#xff0c;使用上只是省略了DB::table(表名)部分。 在模型中使用protected成员变量$table指定绑定的表名。<?php namespace App;use Illuminate\Database\Eloquent\Model;class Flight…

数据库连接字在Web.config里的用法

作者&#xff1a;未知 请速与本人联系在asp.net中的WEB程序的设置中我们必须用到Web.config来存储数据库连接字.事实上这是个很好的做法,因为可以省去我们很多的麻烦还可以帮助我们避免不必要的错位,是的很多情况下我就是这样做.它通过XML来记录这些信息.具体的是在....这个标…

重构ncnn,腾讯优图开源新一代移动端推理框架TNN

来源 | 腾讯优图从学界到工业界&#xff0c;“开源”已经成为AI领域的一个关键词。一方面&#xff0c;它以“授人以渔”的方式为AI构建了一个开放共进的生态环境&#xff0c;帮助行业加速AI应用落地&#xff1b;另一方面&#xff0c;在解决行业实际问题时持续更新和迭代&#x…

java读取文件

1 java8读取文本文件2 3 4 public static void java8ReadFileLines(String fileName) throws IOException {5 List lineList Files.readAllLines(Paths.get(fileName), StandardCharsets.UTF_8);6 7 for(String line:lineList){8 Sys…

常见 Datagrid 错误

Marcie Robillard DatagridGirl.comDatagrid 控件是 Microsoft ASP.NET 中功能最强、用途最广的 Web 控件之一&#xff0c;这一点已经得到了 ASP.NET 权威人士的认同。虽然 Datagrid 控件易于使用&#xff0c;但同样易于给使用者带来麻烦。以下是许多人所犯的一些错误&#xff…

干货!3 个重要因素,带你看透 AI 技术架构方案的可行性!

作者 | 房磊责编 | Carol出品 | AI 科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;人工智能这几年发展的如火如荼&#xff0c;不仅在计算机视觉和自然语言处理领域发生了翻天覆地的变革&#xff0c;在其他领域也掀起了技术革新的浪潮。无论是在新业务上的尝试&…

mysql从另一张获取数据的方法

方法一 CREATE TABLE tmp AS SELECT a.id FROM t_user t JOIN temp a ON t.email a.email; 方法二 INSERT INTO t_user (id,username,PASSWORD,email,user_type,STATUS) SELECT id,REPLACE(email,,_),PASSWORD,email,0,0 FROM temp; 这两个sql都是从另外一张中获取的数据插入…

手动创建Spring项目 Spring framework

之前学习框架一直是看的视频教程&#xff0c;并且在都配套有项目源码&#xff0c;跟着视频敲代码总是很简单&#xff0c;现在想深入了解&#xff0c;自己从官网下载文件手动搭建&#xff0c;就遇到了很多问题记载如下。 首先熟悉一下spring的官方网站&#xff1a;http://spring…

使用 ASP+ DataGrid 控件来创建主视图/详细资料视图

Nikhil Kothari Microsoft Corporation 2000年8月简介 Microsoft Visual Studio.NET 的下一发行版包括 DataGrid Web 控件 (作为服务器控件的 Active Server Page (ASP) 套件的一部分)。 该控件提供用以根据数据源的内容来表示 HTML 的功能。 DataGrid 控件可以用于若干个只…

如何将广告始终定位到网页右下角

body{margin:0;border:0;height:100%;overflow-y:auto;}#test{display:block; bottom:3px; right:3px; width:130px; position:fixed;}/* 以下是写给IE6的 */* html #test{position:absolute;right:18px} * html{overflow-x:auto; overflow-y:hidden;}转载于:https://www.cnblo…

如何用 Python 将 Excel 表格转成可视化图形?| 原力计划

作者 | Waao666责编 | 王晓曼出品 | CSDN 博客前言大家知道&#xff0c;考研很大一部分也是考信息收集能力。每年往往有很多人就是在这上面栽跟头了&#xff0c;不能正确分析各大院校往年的录取信息&#xff0c;进而没能选择合适的报考院校。至于很多院校的录取信息是以 PDF 形…

Mac OS X 下mysql配置备忘

从windows过渡到os x确实需要适应&#xff0c;对于开发人员来讲更是这样。从官网下载目前最新版本的mysql 5.7.13&#xff0c;下载地址&#xff1a;http://dev.mysql.com/downloads/mysql/刚开始非常顺利的安装完mysql&#xff0c;这时候我还没有意识到密码的问题&#xff0c;直…