当前位置: 首页 > news >正文

脚本语言的代码层级

得益于计算机硬件算力的提升,应用原型开发甚至生产环境应用都可以使用解释型语言来构建,目前Python和Node.js都是比较流行的快速开发部署的应用程序语言,从最早期的shell脚本开始,解释型语言对模块化开发支持度越来越好,语言模块化方案的不同会导致代码组织结构的差异,但无论何种形式目的都是实现不同代码逻辑块的索引和复用。

Python

Python的包管理工具是pip,其实pip也是以一个python package的形式存在于系统之中,对于解释型语言,其运行时环境可近似为解释器+包,在解释器初始化启动时就会构建包的索引路径,随着入口代码的执行需要加载依赖的包。

Package Path

对于python而言,解释器就是不同版本的python主程序,对于不同的python主程序可以通过运行site包来查看当前配置下加载模块的目录。

admin@Ubuntu:~$ python3 -m site sys.path = [ '/home/admin', '/usr/lib/python312.zip', '/usr/lib/python3.12', '/usr/lib/python3.12/lib-dynload', '/usr/local/lib/python3.12/dist-packages', '/usr/lib/python3/dist-packages', ] USER_BASE: '/home/admin/.local' (exists) USER_SITE: '/home/admin/.local/lib/python3.12/site-packages' (doesn't exist) ENABLE_USER_SITE: True

Global Level & User Level

Import modules from which directories就是很关键的site configuration,命令的打印显示出python对包的检索路径有Global和User两个不同的范围,其中sys.path会在python启动时自动填入执行命令的工作目录,PYTHONPATH定义的目录以及其他固定系统级别的包检索路径。

此外每个用户都会有自己独立的home路径下包存储路径来存放和索引用户级别的包,因为不同用户的home路径不同,所以用户级别的包索引路径一定不同,以此实现不同用户的运行时环境的不同,ENABLE_USER_SITE为True代表USER_SITE路径会在Python启动时添加到sys.path里。

而不同路径下包的安装体现在PIP命令的参数:

# Global Level Package Install sudo pip3 install <package> # User Level Package Install pip3 install --user <package>

Project Level - venv

随着应用开发部署的需求增多,只有全局和用户两种包索引路径从颗粒度的角度还是过粗,所以从项目的角度定义包索引目录就成为更加细致的需求,目前的方案时使用虚拟环境,构建虚拟环境的venv也是一个python package

admin@Ubuntu:~$ python3 -m venv venv admin@Ubuntu:~/venv$ tree -L 5 . ├── bin │ ├── activate │ ├── activate.csh │ ├── activate.fish │ ├── Activate.ps1 │ ├── pip │ ├── pip3 │ ├── pip3.12 │ ├── python -> python3 │ ├── python3 -> /usr/bin/python3 │ └── python3.12 -> python3 ├── include │ └── python3.12 ├── lib │ └── python3.12 │ └── site-packages │ ├── pip │ │ ├── __init__.py │ │ ├── _internal │ │ ├── __main__.py │ │ ├── __pip-runner__.py │ │ ├── __pycache__ │ │ ├── py.typed │ │ └── _vendor │ └── pip-24.0.dist-info │ ├── AUTHORS.txt │ ├── entry_points.txt │ ├── INSTALLER │ ├── LICENSE.txt │ ├── METADATA │ ├── RECORD │ ├── REQUESTED │ ├── top_level.txt │ └── WHEEL ├── lib64 -> lib └── pyvenv.cfg 13 directories, 24 files

一般会通过加载激活脚本来进入venv的环境,虚拟环境所有的命令和包索引都限制在venv目录下

admin@Ubuntu:~$ source venv/bin/activate (venv) admin@Ubuntu:~$ which python /home/admin/venv/bin/python (venv) admin@Ubuntu:~$ which pip /home/admin/venv/bin/pip (venv) admin@Ubuntu:~$ python -m site sys.path = [ '/home/admin', '/usr/lib/python312.zip', '/usr/lib/python3.12', '/usr/lib/python3.12/lib-dynload', '/home/admin/venv/lib/python3.12/site-packages', ] USER_BASE: '/home/admin/.local' (exists) USER_SITE: '/home/admin/.local/lib/python3.12/site-packages' (doesn't exist) ENABLE_USER_SITE: False

当然也可以直接执行venv目录下的python或者pip命令,因为pyvenv.cfg对环境参数的配置,所以就实现了虚拟的执行环境

admin@Ubuntu:~/venv$ bin/python -m site sys.path = [ '/home/admin/venv', '/usr/lib/python312.zip', '/usr/lib/python3.12', '/usr/lib/python3.12/lib-dynload', '/home/admin/venv/lib/python3.12/site-packages', ] USER_BASE: '/home/admin/.local' (exists) USER_SITE: '/home/admin/.local/lib/python3.12/site-packages' (doesn't exist) ENABLE_USER_SITE: False

Code Root

所以对于Python程序而言,当python程序加载主代码之后,代码执行的结构可近似如下,python解释器会定义一个绝对的逻辑根目录,其下分别是包括入口代码文件的程序代码和实际分散在不同系统路径下的包,这个逻辑根目录就是入口文件所在路径。

  • Python
    • /main.py
    • /<package>/__init__.py
    • /<package>/<module>.py

Package Execution

python对包的设计主要是通过包下__init__.py实现包的导入,此外为了扩展包从引用到可执行入口则通过包下__main__.py实现包的直接解释器执行

python -m <package>

node.js

而对于node.js在web时代逐渐演化而来的编程语言,和python相比

  • 运行时环境更加直接聚焦于项目级别

解释器在系统级别环境共用,但是包索引环境则弱化在Global和User的共享,原生更支持直接不同项目维护自己的包索引环境

  • 项目本身也是包的组织形式

类似于python和pip的关系,node也有对应包管理工具npm,一般会在项目文件夹使用“npm init”或者“npm init -y”来初始化node.js项目/包,最主要的作用就是生成package.json, 用来定义项目/包的信息,入口文件,运行依赖,开发依赖以及脚本命令等。

Local Level

通过使用如下命令在本地项目安装依赖包

npm install <package-name>

包的安装位置就在本地项目文件夹下的node_modules里,并且安装的依赖包都会记录到package.json中。

查看本地路径和包列表的命令如下,因为默认会把当前文件夹作为项目根目录,所以显示的本地包索引地址就是当前目录下的node_modules

admin@Ubuntu:~$ npm root /home/admin/node_modules admin@Ubuntu:~$ npm list

Global Level

当然node.js也会有系统级别的包索引路径,可通过如下命令在系统级别安装依赖包,其路径是系统目录下的node_modules。

npm install -g <package-name>

查看全局路径和包列表的命令如下

admin@Ubuntu:~$ npm root -g /usr/lib/node_modules admin@Ubuntu:~$ npm list -g

Package Path

通过打印module.paths可以显示node对应包的索引路径,优先级为本地目录以及逐级向上目录下的的node_modules为先,然后是系统路径下的node_modules

admin@Ubuntu:~$ node Welcome to Node.js v20.19.6. Type ".help" for more information. > console.log(module.paths) [ '/home/admin/repl/node_modules', '/home/admin/node_modules', '/home/node_modules', '/node_modules', '/home/admin/.node_modules', '/home/admin/.node_libraries', '/usr/lib/node' ]

Code Root

而对于node.js程序,逻辑根目录是package.json所在的路径,而入口文件可以在任意子目录,本地的包索引路径就是在逻辑根目录下的node_modules,系统级别的包索引路径是系统路径下的node_modules。

  • node.js project/package
    • /package.json
    • /../index.js
    • /node_modules/<package>

node的执行逻辑会把当前路径作为逻辑根目录,所以node.js的执行需要保证执行工作目录是package.json所在目录,这点也是和python最大的不同。

Package Execution

每个node.js项目都会有package.json,可以通过bin来定义可执行的入口,npm进行安装的时候会进行脚本的生成和暴露,这里的机制不在赘述,但本质上也是拓展包除了引用之外可执行的功能。

"bin": { "npm": "bin/npm-cli.js", "npx": "bin/npx-cli.js" },
http://www.cnnetsun.cn/news/45029.html

相关文章:

  • Jellyfin Android TV客户端完整使用手册:构建个人媒体中心
  • Obsidian代码块美化插件完整指南:打造专业级技术笔记
  • Wallpaper Engine资源提取神器:3步学会RePKG的完整使用指南
  • 7400万参数撬动百亿市场:Whisper-base.en引领轻量语音识别革命
  • 快速入门指南:SDL多媒体开发库的5个核心功能详解
  • Windows Defender完全禁用指南:Defender Control开源工具深度解析
  • MIDI控制器映射终极完全指南:释放硬件潜能的专业解决方案
  • DeepSeek-V3.2-Exp-Base:2025年开源大模型推理能力新标杆
  • VMware macOS解锁终极指南:在普通PC上轻松运行macOS虚拟机
  • 26、UNIX文件系统:多处理器映射与伪文件系统解析
  • 29、UNIX文件系统备份与管理技术详解
  • 35、开发 Linux 内核的 uxfs 文件系统
  • Gofile下载器技术实现原理与应用实践
  • HoRNDIS:Mac与Android设备间的高速USB网络共享解决方案
  • DeepSeek-V3-0324:6850亿参数大模型的数学推理与代码生成突破
  • 六大网盘高速下载终极指南:告别限速烦恼
  • Qwen3-Omni-Captioner:重构音频理解的全模态革命
  • 如何用ComfyUI Manager彻底改变你的AI绘图工作流程?
  • 终极QQ截图独立版:5分钟快速安装与完整使用指南
  • 27、敏捷开发:迭代0与交付可用软件的实践指南
  • 32、项目迭代与交付:适应变化,确保成功
  • 210亿参数激活仅30亿!ERNIE-4.5-A3B-Thinking重塑企业AI应用范式
  • ComfyUI中使用Normal Map生成增强表面细节
  • 移动端多任务下载性能优化实战:突破300%性能瓶颈的架构设计
  • 12、主动防御:有效抵御网络威胁
  • 如何用PoeCharm实现流放之路角色完美规划:新手必备的5大核心功能
  • 如何选择适合您的编程字体提升编码体验
  • 群晖照片AI识别功能受限?这个补丁让你彻底告别硬件限制
  • Blender与Unity三维数据通道构建指南
  • Obsidian代码块美化实战:让你的技术笔记焕然一新