<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Water Run</title>
    <description>The latest articles on Forem by Water Run (@water_run_305f6dfd401fdaf).</description>
    <link>https://forem.com/water_run_305f6dfd401fdaf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3419504%2Fedbd8cef-5696-4023-90e2-e0feae40eabc.jpg</url>
      <title>Forem: Water Run</title>
      <link>https://forem.com/water_run_305f6dfd401fdaf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/water_run_305f6dfd401fdaf"/>
    <language>en</language>
    <item>
      <title>Introducing RunOnce: A Frictionless Tool for Running Disposable Scripts</title>
      <dc:creator>Water Run</dc:creator>
      <pubDate>Fri, 20 Mar 2026 01:31:50 +0000</pubDate>
      <link>https://forem.com/water_run_305f6dfd401fdaf/introducing-runonce-a-frictionless-tool-for-running-disposable-scripts-2gec</link>
      <guid>https://forem.com/water_run_305f6dfd401fdaf/introducing-runonce-a-frictionless-tool-for-running-disposable-scripts-2gec</guid>
      <description>&lt;p&gt;Writing a script used to take half a day — and once written, it would be reused again and again. Back then, the overhead of creating a new file, naming it, and finding a place to store it was negligible compared to the time spent writing the code itself. Things are fundamentally different now.&lt;/p&gt;

&lt;p&gt;While LLMs may still struggle with large-scale engineering codebases, a focused, single-purpose script of a few dozen to a few hundred lines is something any reasonably capable model can produce effortlessly. Need to aggregate statistics from a directory? Write a script. Remove image backgrounds? Write a script. Even manipulate an Excel file — write a script. Custom code has never been this cheap to produce, and its lifecycle has shrunk to a single use. So much so that the combined effort of creating a file, running it, and deleting it afterward may actually exceed the effort of writing the script itself. Wouldn't it be ideal to simply open an editor, paste the code, hit run, and be done with it?&lt;/p&gt;

&lt;p&gt;Introducing &lt;strong&gt;RunOnce&lt;/strong&gt; — a tool designed precisely for running these disposable, one-off scripts with minimal friction.&lt;/p&gt;




&lt;p&gt;RunOnce is available on the &lt;a href="https://apps.microsoft.com/detail/9NX07BRMKGH2" rel="noopener noreferrer"&gt;Microsoft Store&lt;/a&gt; as a free download. Built on the standard WinUI 3 framework, it integrates seamlessly with Windows 11.&lt;/p&gt;

&lt;p&gt;Upon installation, a new entry — &lt;strong&gt;"Run Code Here"&lt;/strong&gt; — will appear in your right-click context menu. For example, suppose you need a script to generate various asset images from a logo. Simply right-click in the target directory, select "Run Code Here," and an editor will open. Right-click in the blank area to paste your code, then press &lt;strong&gt;Ctrl+Enter&lt;/strong&gt;. Done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiftf3pgfdz70wi5k351y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiftf3pgfdz70wi5k351y.png" alt="RunOnce Editor Interface" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It really is that straightforward. RunOnce automatically detects the programming language, invokes the appropriate runtime, executes the script, and cleans up any temporary files upon completion. The only prerequisite is that the corresponding language runtime is installed on your system.&lt;/p&gt;

&lt;p&gt;In practice, most LLM-generated scripts are written in &lt;strong&gt;Python&lt;/strong&gt;, whose extensive ecosystem of third-party libraries makes it the ideal choice for quick, ad-hoc tasks. That said, RunOnce also supports automatic detection and execution of &lt;strong&gt;Lua&lt;/strong&gt;, &lt;strong&gt;Batch (.bat)&lt;/strong&gt;, &lt;strong&gt;PowerShell&lt;/strong&gt;, &lt;strong&gt;Nim&lt;/strong&gt;, and &lt;strong&gt;Go&lt;/strong&gt;, catering to a range of preferences and requirements.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;An editor must be editable&lt;/strong&gt; — and RunOnce honors that principle. The built-in editor provides basic syntax highlighting for quick review and minor edits, such as adjusting &lt;code&gt;input_file&lt;/code&gt; or &lt;code&gt;output_file&lt;/code&gt; values. It is intentionally minimal: if more substantial changes are needed, it is almost always faster and more reliable to simply ask the LLM to regenerate the script.&lt;/p&gt;

&lt;p&gt;RunOnce also supports passing command-line arguments to scripts, should your use case require it — though scripts that accept parameters tend to be less "disposable" by nature, as parameterization often implies the intent to run them more than once.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjilfggm3wolm24wbude.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjilfggm3wolm24wbude.png" alt="RunOnce Settings" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;One important consideration concerns &lt;strong&gt;file path handling&lt;/strong&gt;. By default, RunOnce operates in &lt;strong&gt;"Ensure Cleanup"&lt;/strong&gt; mode, placing temporary script files in the system's temporary directory. Even if cleanup fails due to an unexpected error, the residual files remain out of sight. This mode works well for the vast majority of scripts.&lt;/p&gt;

&lt;p&gt;However, if your script contains statements that resolve the script's own path — such as &lt;code&gt;os.path.abspath(__file__)&lt;/code&gt; in Python — you should switch to &lt;strong&gt;"Ensure Compatibility"&lt;/strong&gt; mode. In this mode, the temporary file is placed in a more accessible location. Do ensure the terminal closes normally after execution; otherwise, the temporary file may not be cleaned up automatically and will require manual deletion.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0qo1le86ihk63ohiaf2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0qo1le86ihk63ohiaf2.png" alt="RunOnce Advanced Settings" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;RunOnce is open source under the &lt;strong&gt;GPL v3&lt;/strong&gt; license, available on GitHub at &lt;a href="https://github.com/Water-Run/RunOnce" rel="noopener noreferrer"&gt;GitHub - Water-Run/RunOnce: 一次运行 -- 随时随地的运行大模型生成的"一次性"程序. · GitHub&lt;/a&gt;. If you find the project useful, a ⭐ Star on GitHub would be greatly appreciated.&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>winui</category>
      <category>llm</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>tiny tool to package your code for LLM prompts: pmc(pack-my-code)</title>
      <dc:creator>Water Run</dc:creator>
      <pubDate>Sun, 08 Mar 2026 09:40:50 +0000</pubDate>
      <link>https://forem.com/water_run_305f6dfd401fdaf/tiny-tool-to-package-your-code-for-llm-prompts-pmcpack-my-code-20of</link>
      <guid>https://forem.com/water_run_305f6dfd401fdaf/tiny-tool-to-package-your-code-for-llm-prompts-pmcpack-my-code-20of</guid>
      <description>&lt;p&gt;As code-focused large language models support ever-longer context windows (the recently released Claude Opus/Sonnet 4.6 and GPT 5.3 CodeX are big improvements; previously anything over ten thousand lines of context basically triggered “Alzheimer’s”), it’s becoming more common to just copy entire projects into a prompt and feed them to an LLM. Automated coding tools like OpenCode are token-hungry monsters; one big advantage of manual prompting is that you can curate a PLAN-BUILD flow yourself and save money. Manually copying code file by file is obviously tedious, and many nonstandard doc comments don’t include file hierarchy info, which can leave the model confused. There are already similar tools out there, but many are quite heavy. I wrote a lightweight, few-hundred-line binary tool called pmc (pack-my-code) that makes it easy to package your project’s code into a prompt. &lt;a href="https://github.com/Water-Run/pack-my-code" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. You can download the binaries from Releases and add them to your PATH. It’s packaged with luainstaller.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;It’s simple and intuitive.&lt;/p&gt;

&lt;p&gt;Basic usage, in the directory you want to export:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pmc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then press Ctrl+Shift+C. Of course, pmc also supports some slightly more advanced features. In fact, even in the default case above, it already does the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Equivalent to pmc . (the current working directory)&lt;/li&gt;
&lt;li&gt;Respects .gitignore (requires a git environment)&lt;/li&gt;
&lt;li&gt;Prints to the terminal instead of redirecting to a file&lt;/li&gt;
&lt;li&gt;Does not output a tree structure&lt;/li&gt;
&lt;li&gt;Does not output statistics&lt;/li&gt;
&lt;li&gt;Wraps each file’s code in standard Markdown code blocks&lt;/li&gt;
&lt;li&gt;Displays file paths relative to the execution directory&lt;/li&gt;
&lt;li&gt;Does not additionally exclude or include only specific file types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These behaviors are configurable. Check the README for more usage details, or run with the -h flag after installation, including the special YAML mode. Overall it’s a very simple little tool, but at least for me it’s quite handy. :)&lt;/p&gt;

</description>
      <category>lua</category>
      <category>llm</category>
      <category>promptengineering</category>
      <category>tiny</category>
    </item>
    <item>
      <title>A Much Better Windows tree Command that Implemented in Rust (tree++)</title>
      <dc:creator>Water Run</dc:creator>
      <pubDate>Tue, 13 Jan 2026 09:19:54 +0000</pubDate>
      <link>https://forem.com/water_run_305f6dfd401fdaf/a-much-better-windows-tree-command-that-implemented-in-rust-tree-4202</link>
      <guid>https://forem.com/water_run_305f6dfd401fdaf/a-much-better-windows-tree-command-that-implemented-in-rust-tree-4202</guid>
      <description>&lt;h1&gt;
  
  
  tree++: A Much Better Windows &lt;code&gt;tree&lt;/code&gt; Command
&lt;/h1&gt;

&lt;p&gt;As a 40-year-old software, the functionality of Windows' native &lt;code&gt;tree&lt;/code&gt; command has essentially remained stuck in the 1980s:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS C:\Users\linzh&amp;gt; tree /?
Graphically displays the folder structure of a drive or path.

TREE [drive:][path] [/F] [/A]

   /F   Display the names of the files in each folder.
   /A   Use ASCII instead of extended characters.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The functionality of the only two parameters &lt;code&gt;/F&lt;/code&gt; and &lt;code&gt;/A&lt;/code&gt; is clearly insufficient. As a tool extremely useful for describing project architecture and writing prompts in today's LLM era, a &lt;code&gt;tree&lt;/code&gt; command without even directory exclusion functionality becomes directly unusable when facing modern project build systems with &lt;code&gt;target&lt;/code&gt;, &lt;code&gt;node_modules&lt;/code&gt;, &lt;code&gt;.vs&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;Additionally, it's not particularly fast.&lt;/p&gt;

&lt;p&gt;Therefore, over the past half month, I implemented this project with Claude Opus 4.5: &lt;strong&gt;&lt;code&gt;tree++&lt;/code&gt;: A Much Better Windows tree Command&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And yes, it's written in Rust :-)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Links:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Water-Run/treepp/tree/main" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Makes It Better
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;More Features: Covers basically all commonly used functions, including advanced features like output to file&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quick reference of &lt;code&gt;tree++&lt;/code&gt; supported parameters:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option Set (Equivalent Forms)&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--help&lt;/code&gt; &lt;code&gt;-h&lt;/code&gt; &lt;code&gt;/?&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Show help information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--version&lt;/code&gt; &lt;code&gt;-v&lt;/code&gt; &lt;code&gt;/V&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Show version information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--ascii&lt;/code&gt; &lt;code&gt;-a&lt;/code&gt; &lt;code&gt;/A&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Draw the tree using ASCII characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--files&lt;/code&gt; &lt;code&gt;-f&lt;/code&gt; &lt;code&gt;/F&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Show files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--full-path&lt;/code&gt; &lt;code&gt;-p&lt;/code&gt; &lt;code&gt;/FP&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Show full paths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--human-readable&lt;/code&gt; &lt;code&gt;-H&lt;/code&gt; &lt;code&gt;/HR&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Show file sizes in human-readable form&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--no-indent&lt;/code&gt; &lt;code&gt;-i&lt;/code&gt; &lt;code&gt;/NI&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Do not show tree connector lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--reverse&lt;/code&gt; &lt;code&gt;-r&lt;/code&gt; &lt;code&gt;/R&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Sort in reverse order&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--size&lt;/code&gt; &lt;code&gt;-s&lt;/code&gt; &lt;code&gt;/S&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Show file size (bytes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--date&lt;/code&gt; &lt;code&gt;-d&lt;/code&gt; &lt;code&gt;/DT&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Show last modified date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--exclude&lt;/code&gt; &lt;code&gt;-I&lt;/code&gt; &lt;code&gt;/X&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Exclude matching files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--level&lt;/code&gt; &lt;code&gt;-L&lt;/code&gt; &lt;code&gt;/L&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Limit recursion depth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--include&lt;/code&gt; &lt;code&gt;-m&lt;/code&gt; &lt;code&gt;/M&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Show only matching files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--disk-usage&lt;/code&gt; &lt;code&gt;-u&lt;/code&gt; &lt;code&gt;/DU&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Show cumulative directory size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--report&lt;/code&gt; &lt;code&gt;-e&lt;/code&gt; &lt;code&gt;/RP&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Show trailing summary statistics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--prune&lt;/code&gt; &lt;code&gt;-P&lt;/code&gt; &lt;code&gt;/P&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Prune empty directories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--no-win-banner&lt;/code&gt; &lt;code&gt;-N&lt;/code&gt; &lt;code&gt;/NB&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Hide the Windows-native tree banner output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--silent&lt;/code&gt; &lt;code&gt;-l&lt;/code&gt; &lt;code&gt;/SI&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Silent terminal output (use with &lt;code&gt;output&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--output&lt;/code&gt; &lt;code&gt;-o&lt;/code&gt; &lt;code&gt;/O&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Output results to a file (&lt;code&gt;.txt&lt;/code&gt;, &lt;code&gt;.json&lt;/code&gt;, &lt;code&gt;.yml&lt;/code&gt;, &lt;code&gt;.toml&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--batch&lt;/code&gt; &lt;code&gt;-b&lt;/code&gt; &lt;code&gt;/B&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Use batch mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--thread&lt;/code&gt; &lt;code&gt;-t&lt;/code&gt; &lt;code&gt;/T&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Number of scan threads (batch mode, default 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--gitignore&lt;/code&gt; &lt;code&gt;-g&lt;/code&gt; &lt;code&gt;/G&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Honor &lt;code&gt;.gitignore&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Parameters support &lt;em&gt;traditional DOS style&lt;/em&gt;, &lt;em&gt;Unix short&lt;/em&gt;, and &lt;em&gt;Unix long&lt;/em&gt; forms, primarily for compatibility with the original &lt;code&gt;tree&lt;/code&gt; command style&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Faster: The Rust implementation itself is considerably faster than the old COM-based original; abandoning real-time streaming output (commonly used when outputting to files) allows multi-threaded mode to be even many times faster&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Performance comparison (using &lt;code&gt;C:\Windows&lt;/code&gt; as an example):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Time (&lt;code&gt;ms&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Multiplier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;tree /f&lt;/code&gt; (Windows Native)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;20721.90&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.00x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;treepp /f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;7467.99&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2.77x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;treepp /f /nb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;7392.34&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2.80x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;treepp /f /nb /b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3226.38&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;6.42x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;treepp /f /nb /b /t 1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;9123.00&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2.27x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;treepp /f /nb /b /t 2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;5767.71&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3.59x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;treepp /f /nb /b /t 4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3948.73&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;5.25x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;treepp /f /nb /b /t 8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3166.81&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;6.54x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;treepp /f /nb /b /t 16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2704.67&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;7.66x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;On this basis, &lt;code&gt;tree++&lt;/code&gt; is fully compatible with the original &lt;code&gt;tree&lt;/code&gt; (diff-level output consistency): identical valid commands (excluding failed commands and help commands) produce identical results. This includes boilerplate information (opening volume information, ending no-subfolders information), the original quirky DOS-style paths, tree structure representation, and the behavior of the native &lt;code&gt;/F&lt;/code&gt; and &lt;code&gt;/A&lt;/code&gt; parameters, etc.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Download from &lt;a href="https://github.com/Water-Run/treepp/releases/tag/0.1.0" rel="noopener noreferrer"&gt;GitHub Release&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;Extract, place in a suitable path, and add to environment variables.&lt;/p&gt;

&lt;p&gt;Open Windows Terminal and run &lt;code&gt;treepp /v&lt;/code&gt;. If you see the corresponding output, installation is complete.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS C:\Users\linzh&amp;gt; treepp /v
tree++ version 0.1.0

A much better Windows tree command.

author: WaterRun
link: https://github.com/Water-Run/treepp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;Refer to documentation: &lt;a href="//OPTIONS.md"&gt;Options Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some simple examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic usage: &lt;code&gt;tree&lt;/code&gt; and &lt;code&gt;treepp /f&lt;/code&gt;, behaving identically to native
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS D:\data\temp\tempDir&amp;gt; # tree++
PS D:\data\temp\tempDir&amp;gt; treepp
Folder PATH listing for volume Storage
Volume serial number is 26E9-52C1
D:.
└─Tempdir
PS D:\data\temp\tempDir&amp;gt; treepp /f
Folder PATH listing for volume Storage
Volume serial number is 26E9-52C1
D:.
│  TEMP_FILE.txt
│
└─Tempdir
        tempfile.txt

PS D:\data\temp\tempDir&amp;gt; # Native Windows tree
PS D:\data\temp\tempDir&amp;gt; tree
Folder PATH listing for volume Storage
Volume serial number is 26E9-52C1
D:.
└─Tempdir
PS D:\data\temp\tempDir&amp;gt; tree /f
Folder PATH listing for volume Storage
Volume serial number is 26E9-52C1
D:.
│  TEMP_FILE.txt
│
└─Tempdir
        tempfile.txt

PS D:\data\temp\tempDir&amp;gt; # Diff-level identical output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Exclude code, output desired information: Using &lt;code&gt;tree++&lt;/code&gt; project directory as example
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS D:\data\Rust\tree++&amp;gt; # Honor .gitignore and exclude .git and .release directories
PS D:\data\Rust\tree++&amp;gt; treepp /f /g /x .git /x .release
Folder PATH listing for volume Storage
Volume serial number is 26E9-52C1
D:.
│  .gitignore
│  Cargo.lock
│  Cargo.toml
│  LICENSE
│  OPTIONS-zh.md
│  OPTIONS.md
│  README-zh.md
│  README.md
│
├─prompts
│      编码规范.md
│
├─src
│      cli.rs
│      config.rs
│      error.rs
│      main.rs
│      output.rs
│      render.rs
│      scan.rs
│
└─tests
        compatibility_test.rs
        functional_test.rs
        performance_test.rs

PS D:\data\Rust\tree++&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Change style: Modify style, include size information, remove native boilerplate, etc. (accessing from Desktop)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS C:\Users\linzh\Desktop&amp;gt; # Same base parameters, change style, access from Desktop
PS C:\Users\linzh\Desktop&amp;gt; treepp D:\data\Rust\tree++ /f /g /x .git /x .release /s /hr /nb /rp
D:\DATA\RUST\TREE++
│  .gitignore        1.7 KB
│  Cargo.lock        18.6 KB
│  Cargo.toml        798 B
│  LICENSE        35.0 KB
│  OPTIONS-zh.md        18.0 KB
│  OPTIONS.md        19.7 KB
│  README-zh.md        4.2 KB
│  README.md        4.6 KB
│
├─prompts
│      编码规范.md        8.6 KB
│
├─src
│      cli.rs        76.4 KB
│      config.rs        50.7 KB
│      error.rs        40.0 KB
│      main.rs        16.5 KB
│      output.rs        32.7 KB
│      render.rs        151.5 KB
│      scan.rs        92.3 KB
│
└─tests
        compatibility_test.rs        58.7 KB
        functional_test.rs        68.0 KB
        performance_test.rs        45.0 KB

3 directory, 19 files in 0.003s
PS C:\Users\linzh\Desktop&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Scan &lt;code&gt;C:/Windows&lt;/code&gt; and output to file (silent terminal)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS C:\Users\linzh\Desktop&amp;gt; # Default streaming output to text file
PS C:\Windows&amp;gt; treepp /f /o D:\txt_output.txt /si
PS C:\Users\linzh\Desktop&amp;gt; # Batch mode output to JSON, faster
PS C:\Windows&amp;gt; treepp /f /o D:\txt_output.json /b /si
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;If this project helps you, please give it a Star to show your support :-)&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;For any issues, feel free to submit an ISSUE&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>microsoft</category>
      <category>rust</category>
      <category>cli</category>
      <category>programming</category>
    </item>
    <item>
      <title>pptx2png: Convert your .pptx to .png images with one click</title>
      <dc:creator>Water Run</dc:creator>
      <pubDate>Sun, 28 Dec 2025 05:11:50 +0000</pubDate>
      <link>https://forem.com/water_run_305f6dfd401fdaf/pptx2png-convert-your-pptx-to-png-images-with-one-click-41ie</link>
      <guid>https://forem.com/water_run_305f6dfd401fdaf/pptx2png-convert-your-pptx-to-png-images-with-one-click-41ie</guid>
      <description>&lt;h1&gt;
  
  
  &lt;code&gt;pptx2png&lt;/code&gt;: Convert your &lt;code&gt;.pptx&lt;/code&gt; to &lt;code&gt;.png&lt;/code&gt; images with one click
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/Water-Run/pptx2png" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pptx2png&lt;/code&gt; is a Windows desktop application designed to export your &lt;code&gt;.pptx&lt;/code&gt; slides as &lt;code&gt;.png&lt;/code&gt; images with a single click. It is simple and straightforward:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozdheill0351plou1d5p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozdheill0351plou1d5p.png" alt=" " width="800" height="581"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Water-Run/pptx2png/releases/tag/pptx2png" rel="noopener noreferrer"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also use it as a Python library in your code. See:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pypi.org/project/pptx2png/" rel="noopener noreferrer"&gt;PyPI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install pptx2png

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pptx2png&lt;/span&gt;


&lt;span class="n"&gt;pptx2png&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;topng&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;pptx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_presentation.pptx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;output_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;slide_range&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;pptx2png&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;whatis&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# print info
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>tooling</category>
      <category>python</category>
      <category>showdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>luainstaller 2.0: Package Your .lua Scripts into Native Binaries</title>
      <dc:creator>Water Run</dc:creator>
      <pubDate>Mon, 15 Dec 2025 07:36:44 +0000</pubDate>
      <link>https://forem.com/water_run_305f6dfd401fdaf/luainstaller-20-package-your-lua-scripts-into-native-binaries-846</link>
      <guid>https://forem.com/water_run_305f6dfd401fdaf/luainstaller-20-package-your-lua-scripts-into-native-binaries-846</guid>
      <description>&lt;p&gt;There are two ways to package &lt;code&gt;.lua&lt;/code&gt; scripts into binaries: the traditional &lt;code&gt;srlua&lt;/code&gt;, which concatenates the Lua interpreter with the code, and the more modern &lt;code&gt;luastatic&lt;/code&gt;, which performs real compilation. However, each of them has its own problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/LuaDist/srlua" rel="noopener noreferrer"&gt;srlua&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can only package a single &lt;code&gt;.lua&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Requires manual compilation&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;a href="https://github.com/ers35/luastatic" rel="noopener noreferrer"&gt;luastatic&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires a build environment&lt;/li&gt;
&lt;li&gt;Linux-only&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/Water-Run/luainstaller" rel="noopener noreferrer"&gt;luainstaller&lt;/a&gt; is an open-source Python library that wraps precompiled &lt;code&gt;srlua&lt;/code&gt; and provides support for &lt;code&gt;luastatic&lt;/code&gt;. It can be used as a command-line tool, a graphical application, or via a Python library API, and includes dependency analysis and a single-file packaging engine. It works out of the box on both Windows and Linux.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa7o41q0os26psfzuwfcw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa7o41q0os26psfzuwfcw.jpg" alt="man luainstaller" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Usage is very simple. Suppose you have an entry script &lt;code&gt;a.lua&lt;/code&gt;; &lt;code&gt;a.lua&lt;/code&gt; depends on &lt;code&gt;b.lua&lt;/code&gt;, &lt;code&gt;b.lua&lt;/code&gt; depends on &lt;code&gt;c.lua&lt;/code&gt;, and so on.&lt;br&gt;
You do not need to manually compile srlua (or configure a luastatic environment), manually analyze dependencies, merge all code into a single &lt;code&gt;.lua&lt;/code&gt; script (for srlua), and then invoke srlua or luastatic. You only need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install luainstaller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;luainstaller build a.lua
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that’s it.&lt;br&gt;
You do not even need to type commands in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;luainstaller-gui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will launch a Tkinter-based graphical interface that includes the basic functionality.&lt;br&gt;
&lt;code&gt;luainstaller&lt;/code&gt; also supports more parameters and features, including a logging system (recorded using &lt;a href="https://github.com/Water-Run/SimpSave" rel="noopener noreferrer"&gt;SimpSave&lt;/a&gt;), selectable engines, and more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flufrhsistzs8ta4drb7j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flufrhsistzs8ta4drb7j.png" alt="Tkinter GUI" width="800" height="667"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Refer to the detailed documentation on &lt;a href="https://github.com/Water-Run/luainstaller" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; for complete usage instructions. If you find the project helpful, consider giving it a Star to show your support :-)&lt;/p&gt;

</description>
      <category>lua</category>
      <category>linux</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>luainstaller: A Python Tool for Packaging Lua Scripts into Standalone Executables with Dependency Analysis</title>
      <dc:creator>Water Run</dc:creator>
      <pubDate>Sat, 06 Dec 2025 14:42:13 +0000</pubDate>
      <link>https://forem.com/water_run_305f6dfd401fdaf/luainstaller-a-python-tool-for-packaging-lua-scripts-into-standalone-executables-with-dependency-3g4b</link>
      <guid>https://forem.com/water_run_305f6dfd401fdaf/luainstaller-a-python-tool-for-packaging-lua-scripts-into-standalone-executables-with-dependency-3g4b</guid>
      <description>&lt;h1&gt;
  
  
  &lt;code&gt;luainstaller&lt;/code&gt;: Python Library for Packaging &lt;code&gt;.lua&lt;/code&gt; into Binaries with Dependency Analysis
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;luainstaller&lt;/code&gt; is an &lt;a href="https://github.com/Water-Run/luainstaller" rel="noopener noreferrer"&gt;open-source&lt;/a&gt; &lt;strong&gt;Python library&lt;/strong&gt; that follows the &lt;code&gt;LGPL&lt;/code&gt; license. It wraps &lt;a href="https://github.com/ers35/luastatic/tree/master" rel="noopener noreferrer"&gt;luastatic&lt;/a&gt; and provides the capability to &lt;strong&gt;package &lt;code&gt;.lua&lt;/code&gt; files into executables&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;luainstaller&lt;/code&gt; can be used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;As a command-line tool&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;As a graphical tool&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;As a library imported into your projects&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Due to limitations of &lt;code&gt;luastatic&lt;/code&gt; itself, &lt;code&gt;luainstaller&lt;/code&gt; can only be used on &lt;code&gt;linux&lt;/code&gt; platforms; if you need to use it on &lt;code&gt;Windows&lt;/code&gt;, consider &lt;code&gt;wsl&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;luainstaller&lt;/code&gt; is published on &lt;a href="https://pypi.org/project/luainstaller/" rel="noopener noreferrer"&gt;pypi&lt;/a&gt;. Install it using &lt;code&gt;pip&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;luainstaller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, run in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;luainstaller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get the output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;luainstaller by WaterRun. Version 1.0.
Visit: https://github.com/Water-Run/luainstaller :-)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Prepare the &lt;code&gt;luastatic&lt;/code&gt; environment: &lt;code&gt;luarocks install luastatic&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Getting Started Tutorial
&lt;/h2&gt;

&lt;p&gt;The workflow of &lt;code&gt;luainstaller&lt;/code&gt; is very simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyze the current environment and obtain dynamic libraries&lt;/li&gt;
&lt;li&gt;Scan the entry script recursively to build dependency analysis (if automatic dependency analysis is not disabled)&lt;/li&gt;
&lt;li&gt;Merge manually configured dependency scripts to generate the dependency list&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;luastatic&lt;/code&gt; to compile according to the dependency list and output to the specified directory&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As shown:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    {Environment Analysis}
                         |
                  test.lua &amp;lt;Entry Script&amp;gt;
                         |
                 {Automatic Dependency Analysis}
                         |
        ┌───────────────────────────────────┐
        |                                   |
        |        ┌──&amp;gt; require("utils/log")  |
        |        |          │               |
        |        |     utils/log.lua        |
        |        |          │               |
        |        |     require("utils/time")|
        |        |          │               |
        |        |     utils/time.lua       |
        |        |                          |
        |        |                          |
        |        └──&amp;gt; require("core/init")  |
        |                   │               |
        |            core/init.lua          |
        |            core/config.lua        |
        |            core/db.lua            |
        |                                   |
        └───────────────────────────────────┘
                         |
               (Manual Dependency Configuration)
                         |
                  extra/plugin.lua
                         |
                         ↓
                    &amp;lt;Dependency List&amp;gt;
    -------------------------------------------------
    utils/log.lua
    utils/time.lua
    core/init.lua
    core/config.lua
    core/db.lua
    extra/plugin.lua
    -------------------------------------------------
                         ↓
             {Invoke luastatic Compile Command}

luastatic test.lua utils/log.lua utils/time.lua core/init.lua core/config.lua core/db.lua extra/plugin.lua /usr/lib64/liblua.so -o test.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  About Automatic Dependency Analysis
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;luainstaller&lt;/code&gt; has limited automatic dependency analysis capability. The engine matches &lt;code&gt;require&lt;/code&gt; statements in the following forms, performs recursive searching, and obtains the dependency list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'{pkg_name}'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"{pkg_name}"&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'pkg_name'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"pkg_name"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;[[pkg_name]]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Imports using &lt;code&gt;pcall&lt;/code&gt; are also treated as equivalent to &lt;code&gt;require&lt;/code&gt; imports&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Other forms will cause errors, including dynamic dependencies. In such cases, you should disable automatic dependency analysis and manually add the required dependencies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using as a Graphical Tool
&lt;/h3&gt;

&lt;p&gt;The simplest way to use it is through the &lt;code&gt;GUI&lt;/code&gt;.&lt;br&gt;
&lt;code&gt;luainstaller&lt;/code&gt; provides a graphical interface implemented with &lt;code&gt;Tkinter&lt;/code&gt;. After installation, enter in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;luainstaller-gui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will launch it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The GUI interface only includes basic features&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Using as a Command-Line Tool
&lt;/h3&gt;

&lt;p&gt;The primary way to use &lt;code&gt;luainstaller&lt;/code&gt; is as a command-line tool. Simply enter in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;luainstaller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Or &lt;code&gt;luainstaller-cli&lt;/code&gt;, both are equivalent&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Command Set
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Get Help
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;luainstaller &lt;span class="nb"&gt;help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will output usage help.&lt;/p&gt;

&lt;h5&gt;
  
  
  Get Logs
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;luainstaller logs &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-limit&lt;/span&gt; &amp;lt;limit number&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-asc&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will output the operation logs stored by luainstaller.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Parameters:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;limit: The number of outputs to limit, a positive integer&lt;/li&gt;
&lt;li&gt;asc: In chronological order (default is reverse order)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The logging system uses &lt;a href="https://github.com/Water-Run/SimpSave" rel="noopener noreferrer"&gt;SimpSave&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5&gt;
  
  
  Dependency Analysis
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;luainstaller analyze &amp;lt;entry script&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-max&lt;/span&gt; &amp;lt;max dependencies&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--detail&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will perform dependency analysis and output the analysis list.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Parameters:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;max: Maximum dependency tree limit, a positive integer&lt;/li&gt;
&lt;li&gt;detail: Detailed runtime output&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;By default, analyzes up to 36 dependencies&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5&gt;
  
  
  Execute Compilation
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;luainstaller build &amp;lt;entry script&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-require&lt;/span&gt; &amp;lt;dependent .lua scripts&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-max&lt;/span&gt; &amp;lt;max dependencies&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-output&lt;/span&gt; &amp;lt;output binary path&amp;gt;] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--manual&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--detail&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Parameters:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;entry script: The corresponding entry script, starting point of dependency analysis&lt;/li&gt;
&lt;li&gt;require: Dependent scripts, if the corresponding script has been automatically analyzed by the analysis engine, it will be skipped. Multiple scripts separated by commas&lt;/li&gt;
&lt;li&gt;max: Maximum dependency tree limit, a positive integer. By default, analyzes up to 36&lt;/li&gt;
&lt;li&gt;output: Specifies the output binary path, defaults to an executable file with the same name as the .lua in the current directory, automatically adding .exe suffix on Windows platform&lt;/li&gt;
&lt;li&gt;manual: Do not perform dependency analysis, directly compile the entry script unless forcibly specified using -require&lt;/li&gt;
&lt;li&gt;detail: Detailed runtime output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Examples:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;luainstaller hello_world.lua
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compiles hello_world.lua into an executable hello_world (Linux) or hello_world.exe (Windows) in the same directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;luainstaller a.lua &lt;span class="nt"&gt;-require&lt;/span&gt; b.lua,c.lua &lt;span class="nt"&gt;--manual&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Packages a.lua together with dependencies b.lua and c.lua into a binary without automatic dependency analysis. The behavior is completely consistent with using luastatic directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;luainstaller test.lua &lt;span class="nt"&gt;-max&lt;/span&gt; 100 &lt;span class="nt"&gt;-output&lt;/span&gt; ../myProgram &lt;span class="nt"&gt;--detail&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Analyzes test.lua with up to 100 dependency items, packages it into the myProgram binary in the parent directory, and displays detailed compilation information.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using as a Library
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;luainstaller&lt;/code&gt; can also be imported as a library into your scripts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;luainstaller&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And provides a functional API.&lt;/p&gt;

&lt;h2&gt;
  
  
  API Reference
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;get_logs()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Get logs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_logs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="n"&gt;_range&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Returns luainstaller logs.

    :param limit: Return number limit, None means no limit
    :param _range: Return range limit, None means no limit
    :param desc: Whether to return in reverse order
    :return list[dict[str, Any]]: List of log dictionaries
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;luainstaller&lt;/span&gt;

&lt;span class="n"&gt;log_1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;luainstaller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_logs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Get all logs in reverse order
&lt;/span&gt;&lt;span class="n"&gt;log_2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;luainstaller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_logs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_range&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Get up to 100 logs in order, within the range of 128 to 256
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;analyze()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Execute dependency analysis (corresponds to CLI's &lt;code&gt;luainstaller analyze&lt;/code&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;analyze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;max_deps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Execute dependency analysis on the entry script.

    :param entry: Entry script path
    :param max_deps: Maximum recursive dependency count, default 36
    :return list[str]: List of dependency script paths obtained from analysis
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;luainstaller&lt;/span&gt;

&lt;span class="n"&gt;deps_1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;luainstaller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main.lua&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Dependency analysis, analyzes up to 36 dependencies by default
&lt;/span&gt;&lt;span class="n"&gt;deps_2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;luainstaller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main.lua&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_deps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;112&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Execute dependency analysis, modify maximum dependency analysis count to 112
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;build()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Execute compilation (corresponds to CLI's &lt;code&gt;luainstaller build&lt;/code&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="n"&gt;requires&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="n"&gt;max_deps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="n"&gt;manual&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Execute script compilation.

    :param entry: Entry script
    :param requires: Manually specify dependency list; if empty, rely only on automatic analysis
    :param max_deps: Maximum dependency tree analysis count
    :param output: Output binary path, None uses default rule
    :param manual: Disable automatic dependency analysis
    :return str: Path of the generated executable file
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;luainstaller&lt;/span&gt;

&lt;span class="c1"&gt;# Simplest build method, automatically analyzes dependencies and generates an executable with the same name as the script
&lt;/span&gt;&lt;span class="n"&gt;luainstaller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello.lua&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Manual mode: Disable automatic dependency analysis, compile only with scripts specified in requires
&lt;/span&gt;&lt;span class="n"&gt;luainstaller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a.lua&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requires&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b.lua&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;c.lua&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;manual&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>lua</category>
      <category>linux</category>
    </item>
    <item>
      <title>SimpSave 10: A “ready-to-use” lightweight database, now supporting multiple engine options (including SQLite).</title>
      <dc:creator>Water Run</dc:creator>
      <pubDate>Sun, 09 Nov 2025 10:06:25 +0000</pubDate>
      <link>https://forem.com/water_run_305f6dfd401fdaf/simpsave-10-a-ready-to-use-lightweight-database-now-supporting-multiple-engine-options-1a94</link>
      <guid>https://forem.com/water_run_305f6dfd401fdaf/simpsave-10-a-ready-to-use-lightweight-database-now-supporting-multiple-engine-options-1a94</guid>
      <description>&lt;p&gt;How to persist data in Python?&lt;br&gt;
The most standard method is naturally to use a database. However, for many scenarios such as simple scripts or student assignments, even something as lightweight as TinyDB might be too "heavy" and cumbersome.&lt;br&gt;
SimpSave is a featherweight database with a functional minimalist API that is extremely easy to pick up (almost the simplest form of data persistence), featuring "read-and-use" capability (storage and retrieval preserve types, no need for type conversion), making it very suitable for use in such scenarios. SimpSave 10 brings multi-engine support, and support for SQLITE gives it a certain level of production-grade capability.&lt;br&gt;
"Read-and-use" example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;
&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# [1, 2, 3, 4]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the project helps you, please feel free to give it a Star on GitHub :)&lt;br&gt;
&lt;a href="https://github.com/Water-Run/SimpSave" rel="noopener noreferrer"&gt;https://github.com/Water-Run/SimpSave&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  SimpSave Version 10
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SimpSave&lt;/strong&gt; is a Python featherweight key-value storage database for Python basic variables, leveraging Python's native powerful data structure support, "read-and-use", extremely easy to get started with, very suitable for use in various small scripts such as student assignments, or as configuration files, etc.&lt;br&gt;
&lt;strong&gt;SimpSave 10&lt;/strong&gt; is a major upgrade, bringing optional engine capabilities: the engine wrapper for &lt;code&gt;sqlite&lt;/code&gt; provides it with a usable level in some lightweight production environments (although the functional API has no connection pool mechanism); while for use in simple environments, optional dependencies can maintain the original zero-dependency minimalist characteristics.&lt;/p&gt;
&lt;h3&gt;
  
  
  Core Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extremely lightweight&lt;/strong&gt;: Core code is concise and efficient, minimal installation has no dependencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extremely easy to get started&lt;/strong&gt;: Functional API (&lt;code&gt;read()&lt;/code&gt;, &lt;code&gt;write()&lt;/code&gt;, etc.) is very intuitive, almost no learning curve, can be used directly
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;  &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;
  &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 'value1'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read-and-use&lt;/strong&gt;: Stored type and retrieved type remain consistent, no need for type judgment and conversion, further simplifying usage
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;  &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;
  &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;  &lt;span class="c1"&gt;# 'int'
&lt;/span&gt;  &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  &lt;span class="c1"&gt;# 2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-engine support&lt;/strong&gt;: From the dependency-free lightweight &lt;code&gt;XML&lt;/code&gt; engine to the production-performance &lt;code&gt;SQLITE&lt;/code&gt; engine. &lt;strong&gt;SimpSave&lt;/strong&gt; automatically selects the engine based on file extension, no manual configuration needed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SimpSave&lt;/strong&gt; is published on &lt;a href="https://pypi.org/project/simpsave/" rel="noopener noreferrer"&gt;PyPI&lt;/a&gt;, install using &lt;code&gt;pip&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;simpsave
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, import it in your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;  &lt;span class="c1"&gt;# commonly aliased as 'ss'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you can start using it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optional Dependencies
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SimpSave&lt;/strong&gt; supports optional dependencies, which can be selected for installation based on actual needs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;simpsave                &lt;span class="c"&gt;# Install all dependencies&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;simpsave[XML]           &lt;span class="c"&gt;# Minimal: only includes XML engine (requires xml.etree)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;simpsave[INI]           &lt;span class="c"&gt;# Includes XML and INI engines (no extra dependencies)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;simpsave[YML]           &lt;span class="c"&gt;# Includes XML and YML engines (requires PyYAML)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;simpsave[TOML]          &lt;span class="c"&gt;# Includes XML and TOML engines (requires tomli)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;simpsave[JSON]          &lt;span class="c"&gt;# Includes XML and JSON engines (no extra dependencies)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;simpsave[SQLITE]        &lt;span class="c"&gt;# Includes XML and SQLITE engines (requires sqlite3)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;SQLITE&lt;/code&gt; engine requires the &lt;code&gt;SQLite&lt;/code&gt; environment to be deployed on the local machine in advance&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Quick Start Example
&lt;/h2&gt;

&lt;p&gt;The following code provides a quick start example for &lt;strong&gt;SimpSave&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

&lt;span class="c1"&gt;# Write data
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;scores&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;92&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# Read data
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;     &lt;span class="c1"&gt;# Alice
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;      &lt;span class="c1"&gt;# 25
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;scores&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# [90, 85, 92]
&lt;/span&gt;
&lt;span class="c1"&gt;# Check keys
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;      &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;     &lt;span class="c1"&gt;# False
&lt;/span&gt;
&lt;span class="c1"&gt;# Delete key
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;       &lt;span class="c1"&gt;# False
&lt;/span&gt;
&lt;span class="c1"&gt;# Regex matching
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_admin&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_guest&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;^user_&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# {'user_admin': True, 'user_guest': False}
&lt;/span&gt;
&lt;span class="c1"&gt;# Use different files (automatically select corresponding engine)
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;theme&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dark&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;config.yml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;theme&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;config.yml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# dark
&lt;/span&gt;
&lt;span class="c1"&gt;# Use :ss: mode (save to installation directory)
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;键1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;值1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:ss:config.toml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Use Chinese key names and TOML engine
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;键1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:ss:config.toml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# 值1
&lt;/span&gt;
&lt;span class="c1"&gt;# Delete files
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;config.yml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you have some programming foundation, I believe &lt;strong&gt;SimpSave&lt;/strong&gt;'s extreme intuitiveness has already taught you its basic usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engines
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SimpSave 10&lt;/strong&gt; supports multiple storage engines, which can be selected based on actual needs. Engines are stored in the &lt;code&gt;ss.ENGINE&lt;/code&gt; enumeration:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Engine Name&lt;/th&gt;
&lt;th&gt;File Format&lt;/th&gt;
&lt;th&gt;Dependencies&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;XML&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.xml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;xml.etree&lt;/code&gt; (built-in)&lt;/td&gt;
&lt;td&gt;Uses XML format for storage, lightweight and requires no extra dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INI&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.ini&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;configparser&lt;/code&gt; (built-in)&lt;/td&gt;
&lt;td&gt;Uses INI format for storage, not fully compatible with &lt;code&gt;Unicode&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;YML&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PyYAML&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uses YAML format for storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TOML&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.toml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tomli&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uses TOML format for storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;JSON&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;json&lt;/code&gt; (built-in)&lt;/td&gt;
&lt;td&gt;Uses JSON format for storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SQLITE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.db&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sqlite3&lt;/code&gt; (built-in)&lt;/td&gt;
&lt;td&gt;Uses SQLite database, has production-grade performance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Automatic Engine Selection
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SimpSave&lt;/strong&gt; automatically selects the appropriate engine based on the file extension of the &lt;code&gt;file&lt;/code&gt; parameter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data.yml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# Automatically uses YML engine
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;config.toml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Automatically uses TOML engine
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data.db&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# Automatically uses SQLITE engine
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Principles
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SimpSave&lt;/strong&gt; uses key-value pairs to save Python's basic type data. Depending on the chosen engine, data will be stored in different formats.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;By default, data is saved to the &lt;code&gt;__ss__.xml&lt;/code&gt; file in the current working directory&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;:ss:&lt;/code&gt; Mode
&lt;/h3&gt;

&lt;p&gt;As with the old version, &lt;strong&gt;SimpSave&lt;/strong&gt; retains support for the unique &lt;code&gt;:ss:&lt;/code&gt; path mode: if the file path starts with &lt;code&gt;:ss:&lt;/code&gt; (such as &lt;code&gt;:ss:config.json&lt;/code&gt;), the file will be saved in the &lt;strong&gt;SimpSave&lt;/strong&gt; installation directory, thus ensuring cross-environment compatibility.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:ss:config.yml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Save to SimpSave installation directory
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:ss:config.yml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;      &lt;span class="c1"&gt;# Read from installation directory
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;:ss:&lt;/code&gt; mode requires SimpSave to be installed via &lt;code&gt;pip&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Data Types
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SimpSave&lt;/strong&gt; fully supports Python's built-in basic types, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;int&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;float&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;str&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list&lt;/code&gt; (including nested, items within nesting also need to be Python's basic type data, same below)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dict&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tuple&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;None&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When reading data, &lt;strong&gt;SimpSave&lt;/strong&gt; automatically restores it to the original &lt;code&gt;Python&lt;/code&gt; type, achieving "read-and-use".&lt;/p&gt;

&lt;h2&gt;
  
  
  API Reference
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Writing Data
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;write&lt;/code&gt; function is used to write key-value pairs to a specified file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the specified storage file does not exist, it will be created automatically.&lt;/p&gt;

&lt;h4&gt;
  
  
  Parameter Description
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;key&lt;/code&gt;: The key to be stored, must be a valid string&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;value&lt;/code&gt;: The value to be stored, supports Python basic types&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt;: The file path to write to, defaults to &lt;code&gt;__ss__.xml&lt;/code&gt;, can use &lt;code&gt;:ss:&lt;/code&gt; mode. The engine will be automatically selected based on the file extension&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Return Value
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Returns &lt;code&gt;True&lt;/code&gt; if written successfully, returns &lt;code&gt;False&lt;/code&gt; if failed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Exceptions
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ValueError&lt;/code&gt;: Value is not a Python basic type value&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;IOError&lt;/code&gt;: Write error&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RuntimeError&lt;/code&gt;: Other runtime errors, such as selected engine not installed, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hello 世界&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;# Write Unicode string
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                  &lt;span class="c1"&gt;# Write float
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;中文&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;      &lt;span class="c1"&gt;# Write list containing Chinese
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key4&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;      &lt;span class="c1"&gt;# Write dictionary
&lt;/span&gt;
&lt;span class="c1"&gt;# Use different engines
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;config&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;settings.yml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# Use YML engine
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cache.db&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;             &lt;span class="c1"&gt;# Use SQLITE engine
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If the file does not exist, SimpSave will create it automatically.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Reading Data
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;read&lt;/code&gt; function is used to read data from a specified file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Parameter Description
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;key&lt;/code&gt;: The key name to read.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt;: The file path to read from, defaults to &lt;code&gt;__ss__.xml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Return Value
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Returns the value corresponding to the specified key, automatically restored to the original type.&lt;/li&gt;
&lt;li&gt;If the key does not exist, returns &lt;code&gt;None&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Exceptions
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;IOError&lt;/code&gt;: Read error&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RuntimeError&lt;/code&gt;: Other runtime errors, such as selected engine not installed, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Output: 'Hello 世界'
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Output: 3.14
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Output: [1, 2, 3, '中文']
&lt;/span&gt;
&lt;span class="c1"&gt;# Read from different files
&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;config&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;settings.yml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Checking if Key Exists
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;has&lt;/code&gt; function is used to check if a certain key exists in the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Parameter Description
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;key&lt;/code&gt;: The key name to check.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt;: The file path to check, defaults to &lt;code&gt;__ss__.xml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Return Value
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Returns &lt;code&gt;True&lt;/code&gt; if the key exists, returns &lt;code&gt;False&lt;/code&gt; if it does not exist.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Exceptions
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;IOError&lt;/code&gt;: Read error&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RuntimeError&lt;/code&gt;: Other runtime errors, such as selected engine not installed, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;        &lt;span class="c1"&gt;# Output: True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;nonexistent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# Output: False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deleting Keys
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;remove&lt;/code&gt; function is used to delete a key and its corresponding value from a file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Parameter Description
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;key&lt;/code&gt;: The key name to delete.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt;: The file path to operate on, defaults to &lt;code&gt;__ss__.xml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Return Value
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Returns &lt;code&gt;True&lt;/code&gt; if deleted successfully, returns &lt;code&gt;False&lt;/code&gt; if failed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Exceptions
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;IOError&lt;/code&gt;: Write error&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RuntimeError&lt;/code&gt;: Other runtime errors, such as selected engine not installed, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Delete key 'key1'
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Output: False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Regex Matching Keys
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;match&lt;/code&gt; function can match all keys that meet the conditions through regular expressions and return the corresponding key-value pairs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Parameter Description
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;re&lt;/code&gt;: Regular expression string, used to match key names. Empty string means match all keys.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt;: The file path to operate on, defaults to &lt;code&gt;__ss__.xml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Return Value
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Returns a dictionary containing all matched key-value pairs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Exceptions
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;IOError&lt;/code&gt;: Read error&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RuntimeError&lt;/code&gt;: Other runtime errors, such as selected engine not installed, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;admin_name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Bob&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;^user_.*&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Match all keys starting with 'user_'
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Output: {'user_name': 'Alice', 'user_age': 25}
&lt;/span&gt;
&lt;span class="n"&gt;all_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Get all key-value pairs
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deleting Files
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;delete&lt;/code&gt; function can delete the entire storage file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Parameter Description
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt;: The file path to delete, defaults to &lt;code&gt;__ss__.xml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Return Value
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Returns &lt;code&gt;True&lt;/code&gt; if deleted successfully, returns &lt;code&gt;False&lt;/code&gt; if failed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Exceptions
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;IOError&lt;/code&gt;: Delete error&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RuntimeError&lt;/code&gt;: Other runtime errors, such as selected engine not installed, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Delete the default save file
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;config.yml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Delete specified file
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Exception Handling
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SimpSave&lt;/strong&gt; may throw the following exceptions during operation. Understanding these exceptions helps write more robust code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Exception Types
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;ValueError&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Thrown when the passed value is not a Python basic type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trigger Scenarios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attempting to store unsupported complex objects (such as custom class instances, functions, etc.)&lt;/li&gt;
&lt;li&gt;The passed value exceeds the type range supported by the engine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomClass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;CustomClass&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  &lt;span class="c1"&gt;# Throws ValueError
&lt;/span&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;code&gt;IOError&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Thrown when file read/write operations fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trigger Scenarios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Insufficient file permissions&lt;/li&gt;
&lt;li&gt;Insufficient disk space&lt;/li&gt;
&lt;li&gt;File occupied by other processes&lt;/li&gt;
&lt;li&gt;File path does not exist or is invalid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/root/protected.db&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# May throw IOError
&lt;/span&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;IOError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;File operation error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;code&gt;RuntimeError&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Other runtime errors, usually engine internal errors or configuration issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trigger Scenarios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engine initialization failed&lt;/li&gt;
&lt;li&gt;Data format corrupted&lt;/li&gt;
&lt;li&gt;Dependency library missing or version incompatible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data.unknown&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# May throw RuntimeError
&lt;/span&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;RuntimeError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Runtime error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exception Handling Best Practices
&lt;/h3&gt;

&lt;p&gt;It is recommended to use &lt;code&gt;try-except&lt;/code&gt; statements to handle possible exceptions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

&lt;span class="c1"&gt;# Safe write
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Value type error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;IOError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;File write failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;RuntimeError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Runtime error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Safe read
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Key does not exist&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;IOError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;File read failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;RuntimeError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Runtime error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Practice Suggestions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;When using non-&lt;code&gt;SQLITE&lt;/code&gt; engines, control data volume and complexity;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Before reading data, use &lt;code&gt;has&lt;/code&gt; or &lt;code&gt;try-except&lt;/code&gt; statements for safe reading:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;
&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;default value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key_1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key_1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key_1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;default value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- When unable to confirm whether the corresponding file exists, use `try-except` combined with initialization statements.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Learn more, visit &lt;a href="https://github.com/Water-Run/SimpSave" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>database</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Bat-KV: Lightweight Key-Value Store for Windows Batch</title>
      <dc:creator>Water Run</dc:creator>
      <pubDate>Sun, 21 Sep 2025 16:12:37 +0000</pubDate>
      <link>https://forem.com/water_run_305f6dfd401fdaf/bat-kv-lightweight-key-value-store-for-windows-batch-5f2f</link>
      <guid>https://forem.com/water_run_305f6dfd401fdaf/bat-kv-lightweight-key-value-store-for-windows-batch-5f2f</guid>
      <description>&lt;h1&gt;
  
  
  &lt;code&gt;Bat-KV&lt;/code&gt;: An Ultra-Lightweight Database for Windows Batch (&lt;code&gt;.bat&lt;/code&gt;)
&lt;/h1&gt;

&lt;p&gt;Windows batch scripting is notoriously tricky, especially when it comes to persisting simple data.&lt;br&gt;&lt;br&gt;
&lt;code&gt;Bat-KV&lt;/code&gt; is an open-source, single-file key-value database designed for &lt;code&gt;.bat&lt;/code&gt; scripts. It provides the basic CRUD operations, wraps some simple APIs, and is quick to pick up.&lt;br&gt;&lt;br&gt;
If this project helps you, consider giving it a Star on GitHub.&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/Water-Run/Bat-KV" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;  &lt;/p&gt;


&lt;h2&gt;
  
  
  Bat-KV Basics
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Storage Files
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File Extension&lt;/strong&gt;: &lt;code&gt;.bkv&lt;/code&gt; (Batch Key-Value)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format&lt;/strong&gt;: One key-value pair per line, separated by a backslash &lt;code&gt;\&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  username\Alice
  age\25
  city\Beijing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default Filename&lt;/strong&gt;: &lt;code&gt;_BATKV.bkv&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encoding&lt;/strong&gt;: ANSI recommended for platform compatibility
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key Constraints&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Only English letters, digits, and underscores allowed
&lt;/li&gt;
&lt;li&gt;Maximum length of 36 characters
&lt;/li&gt;
&lt;li&gt;Case-sensitive
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Naming Conventions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public Functions&lt;/strong&gt;: Start with &lt;code&gt;BKV.&lt;/code&gt;, e.g., &lt;code&gt;BKV.New&lt;/code&gt;, &lt;code&gt;BKV.Fetch&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private Functions&lt;/strong&gt;: Start with &lt;code&gt;BKV.Private.&lt;/code&gt;, not intended for external use
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal Variables&lt;/strong&gt;: Start with &lt;code&gt;BKV.Inner.&lt;/code&gt;, not intended for external access
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Return Variables&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;BKV_STATUS&lt;/code&gt;: Execution result (&lt;code&gt;OK&lt;/code&gt; / &lt;code&gt;NotOK&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BKV_RESULT&lt;/code&gt;: Data returned by queries (e.g., &lt;code&gt;BKV.Fetch&lt;/code&gt; value)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BKV_ERR&lt;/code&gt;: Error detail if failure occurs, in the format &lt;code&gt;Bat-KV ERR: [message]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Download &amp;amp; Installation
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Getting Bat-KV
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;a href="https://github.com/Water-Run/Bat-KV/releases/tag/Bat-KV" rel="noopener noreferrer"&gt;GitHub Release page&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Download &lt;code&gt;Bat-KV.zip&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Extract and locate the core file &lt;code&gt;Bat-KV.bat&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Importing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Use&lt;/strong&gt;: Place &lt;code&gt;Bat-KV.bat&lt;/code&gt; in the same directory as your batch script, call it directly
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relative Path&lt;/strong&gt;: If the file is in a subdirectory or parent directory, prefix the path
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global Use&lt;/strong&gt;: Add the directory containing &lt;code&gt;Bat-KV.bat&lt;/code&gt; to your system PATH environment variable
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="c"&gt;REM Current directory&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.New

&lt;span class="c"&gt;REM Subdirectory&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;lib&lt;/span&gt;\Bat&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.New &lt;span class="s2"&gt;"mydata.bkv"&lt;/span&gt;

&lt;span class="c"&gt;REM Parent directory&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; ..\Bat&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.Fetch &lt;span class="s2"&gt;"username"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;p&gt;A minimal example including creating a database, writing, reading, and deleting data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;@echo &lt;span class="na"&gt;off&lt;/span&gt;

&lt;span class="c"&gt;REM Create database&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.New
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="kd"&gt;Create&lt;/span&gt; &lt;span class="kd"&gt;status&lt;/span&gt;: &lt;span class="nv"&gt;%BKV_STATUS%&lt;/span&gt;

&lt;span class="c"&gt;REM Insert data&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.Append &lt;span class="s2"&gt;"name"&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.Append &lt;span class="s2"&gt;"age"&lt;/span&gt; &lt;span class="s2"&gt;"25"&lt;/span&gt;

&lt;span class="c"&gt;REM Read data&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.Fetch &lt;span class="s2"&gt;"name"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="kd"&gt;Name&lt;/span&gt;: &lt;span class="nv"&gt;%BKV_RESULT%&lt;/span&gt;

&lt;span class="c"&gt;REM Check key existence&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.Include &lt;span class="s2"&gt;"email"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;%BKV_RESULT%&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s2"&gt;"No"&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.Append &lt;span class="s2"&gt;"email"&lt;/span&gt; &lt;span class="s2"&gt;"alice@example.com"&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;REM Delete data&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.Remove &lt;span class="s2"&gt;"age"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="kd"&gt;Remove&lt;/span&gt; &lt;span class="kd"&gt;status&lt;/span&gt;: &lt;span class="nv"&gt;%BKV_STATUS%&lt;/span&gt;

&lt;span class="nb"&gt;pause&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  API Quick Reference
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;BKV.New&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Create a new database file. Existing files are not overwritten.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.New &lt;span class="s2"&gt;"config.bkv"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;BKV.Append&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Insert or update a key-value pair.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.Append &lt;span class="s2"&gt;"username"&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;BKV.Fetch&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Read the value of a given key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.Fetch &lt;span class="s2"&gt;"username"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="kd"&gt;User&lt;/span&gt;: &lt;span class="nv"&gt;%BKV_RESULT%&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;BKV.Remove&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Remove a key-value pair. Returns success even if the key does not exist.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.Remove &lt;span class="s2"&gt;"username"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;BKV.Include&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Check if a key exists.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.Include &lt;span class="s2"&gt;"db_host"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;%BKV_RESULT%&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s2"&gt;"No"&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kd"&gt;Bat&lt;/span&gt;&lt;span class="na"&gt;-KV&lt;/span&gt;.bat &lt;span class="nl"&gt;:BKV&lt;/span&gt;.Append &lt;span class="s2"&gt;"db_host"&lt;/span&gt; &lt;span class="s2"&gt;"localhost"&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Full Documentation
&lt;/h2&gt;

&lt;p&gt;For complete documentation and example programs, refer to the &lt;a href="https://github.com/Water-Run/Bat-KV/tree/main" rel="noopener noreferrer"&gt;GitHub main repository&lt;/a&gt; and the scripts attached to the Release.  &lt;/p&gt;

</description>
      <category>database</category>
      <category>programming</category>
      <category>tooling</category>
      <category>opensource</category>
    </item>
    <item>
      <title>SimpSave: Minimalistic and Immediate Python Data Persistence for Student Projects and Lightweight Scripts</title>
      <dc:creator>Water Run</dc:creator>
      <pubDate>Thu, 07 Aug 2025 13:15:26 +0000</pubDate>
      <link>https://forem.com/water_run_305f6dfd401fdaf/simpsave-minimalistic-and-immediate-python-data-persistence-for-student-projects-and-lightweight-pf1</link>
      <guid>https://forem.com/water_run_305f6dfd401fdaf/simpsave-minimalistic-and-immediate-python-data-persistence-for-student-projects-and-lightweight-pf1</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;How can we save data in Python programs?&lt;br&gt;&lt;br&gt;
Without a doubt, the standard approach is to use a database. For lightweight storage needs, Python even comes with built-in support for SQLite. However, for most of our student projects or simple scripts, we’re far from dealing with "big data"—the data volume is often just dozens, tens, or even just a few entries, which can truly be called "micro data." In such cases, not only is SQLite overkill, but even something as lightweight as &lt;a href="https://tinydb.readthedocs.io/en/latest/" rel="noopener noreferrer"&gt;TinyDB&lt;/a&gt; may not be "portable" enough.&lt;/p&gt;

&lt;p&gt;Python’s native data structures are already powerful enough to handle many everyday use cases. &lt;strong&gt;If there were a simple and extremely easy-to-use (almost zero learning curve) key-value database, which also wrapped some common features (such as regex matching on keys, or easily accessing the same database across &lt;code&gt;.py&lt;/code&gt; files in different directories), and allowed data types to be consistent between storage and retrieval so that data can be "used as soon as it’s read" (i.e., database operations and value operations become unified), wouldn’t that be wonderful?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;For these reasons, the project &lt;a href="https://github.com/Water-Run/SimpSave/tree/master" rel="noopener noreferrer"&gt;SimpSave&lt;/a&gt; was created. If this project helps you, please consider giving it a star to show your support! :)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgduem5w4u0pprhgr70xs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgduem5w4u0pprhgr70xs.png" alt=" " width="800" height="189"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;("Read-and-Use Immediately" Example)&lt;/em&gt;  &lt;/p&gt;
&lt;h2&gt;
  
  
  Documentation &lt;em&gt;(from README.md)&lt;/em&gt;
&lt;/h2&gt;


&lt;h1&gt;
  
  
  SimpSave 4.0
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;SimpSave 4.0 is a lightweight Python library for simple and efficient data persistence, &lt;strong&gt;now upgraded to use &lt;code&gt;.yml&lt;/code&gt; files&lt;/strong&gt; for storage. This shift from &lt;code&gt;.ini&lt;/code&gt; to &lt;code&gt;.yml&lt;/code&gt; brings enhanced support for Unicode and complex data structures, removing the need for UTF-8 or escape-based conversions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extremely Simple&lt;/strong&gt;: The whole project remains under 200 lines of code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy to Use&lt;/strong&gt;: Minimal setup and a clean, intuitive API for fast integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible and Lightweight&lt;/strong&gt;: Supports all Python basic types, including Unicode, with no external dependencies (except &lt;code&gt;PyYAML&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YAML Native&lt;/strong&gt;: Full native Unicode and structure support—no more escapes or encoding tricks.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Compatible with SimpSave version 4.0.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;SimpSave 4.0 is available on PyPI and can be installed with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;simpsave
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; SimpSave 4.0 requires the &lt;a href="https://pypi.org/project/PyYAML/" rel="noopener noreferrer"&gt;&lt;code&gt;PyYAML&lt;/code&gt;&lt;/a&gt; library, which will be installed automatically via pip.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To use SimpSave in your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;  &lt;span class="c1"&gt;# Typically aliased as 'ss'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Principle
&lt;/h2&gt;

&lt;p&gt;SimpSave 4.0 stores Python basic type variables in &lt;code&gt;.yml&lt;/code&gt; files using key-value pairs. By default, it saves data in a file named &lt;code&gt;__ss__.yml&lt;/code&gt; located in the current working directory. You can also specify a custom file path if needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unique Path Mode
&lt;/h3&gt;

&lt;p&gt;Just as before, SimpSave supports a unique &lt;code&gt;:ss:&lt;/code&gt; path mode. If your file path starts with &lt;code&gt;:ss:&lt;/code&gt; (e.g., &lt;code&gt;:ss:config.yml&lt;/code&gt;), the file will be stored in the SimpSave installation directory, ensuring compatibility across environments.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: The &lt;code&gt;:ss:&lt;/code&gt; mode requires SimpSave to be installed via &lt;code&gt;pip&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Example of a SimpSave &lt;code&gt;.yml&lt;/code&gt; File
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;key1&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Hello 世界&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;str&lt;/span&gt;
&lt;span class="na"&gt;key2&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3.14&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;float&lt;/span&gt;
&lt;span class="na"&gt;key3&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;中文"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="pi"&gt;}]&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you read the data, SimpSave automatically converts it back to its original type. SimpSave 4.0 fully supports Python's built-in types including &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;dict&lt;/code&gt;, and Unicode strings.&lt;/p&gt;




&lt;h2&gt;
  
  
  Usage Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Writing Data
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;write&lt;/code&gt; function stores key-value pairs in a specified &lt;code&gt;.yml&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Parameters:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;key&lt;/code&gt;: The key under which the value will be stored. Must be a valid YAML key.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;value&lt;/code&gt;: The value to store. Must be a Python basic type (e.g., &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;float&lt;/code&gt;, &lt;code&gt;str&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;dict&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt;: The path of the &lt;code&gt;.yml&lt;/code&gt; file to write to. Defaults to &lt;code&gt;__ss__.yml&lt;/code&gt;. Can also use &lt;code&gt;:ss:&lt;/code&gt; mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Return Value:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Returns &lt;code&gt;True&lt;/code&gt; if the write operation is successful, otherwise &lt;code&gt;False&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;
&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hello 世界&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# Writes a Unicode string
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;             &lt;span class="c1"&gt;# Writes a float
&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;中文&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# Writes a list with Unicode
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If the file does not exist, SimpSave creates it automatically.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Reading Data
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;read&lt;/code&gt; function retrieves a value from a specified &lt;code&gt;.yml&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Parameters:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;key&lt;/code&gt;: The key to read from the file.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt;: The path of the &lt;code&gt;.yml&lt;/code&gt; file to read from. Defaults to &lt;code&gt;__ss__.yml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Return Value:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Returns the value stored under the specified key, automatically converted to its original type.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Outputs: 'Hello 世界'
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Outputs: 3.14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Additional Features
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Checking Key Existence
&lt;/h4&gt;

&lt;p&gt;The &lt;code&gt;has&lt;/code&gt; function checks if a key exists in the &lt;code&gt;.yml&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;          &lt;span class="c1"&gt;# Outputs: True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;nonexistent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# Outputs: False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Removing Keys
&lt;/h4&gt;

&lt;p&gt;The &lt;code&gt;remove&lt;/code&gt; function deletes a key (and its value) from the &lt;code&gt;.yml&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;
&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Removes the key 'key1'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Regular Expression Matching
&lt;/h4&gt;

&lt;p&gt;The &lt;code&gt;match&lt;/code&gt; function retrieves all key-value pairs that match a given regular expression:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;^key.*&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Matches all keys starting with 'key'
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Outputs: {'key2': 3.14, 'key3': [1, 2, 3, '中文']}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  Deleting Files
&lt;/h4&gt;

&lt;p&gt;The &lt;code&gt;delete&lt;/code&gt; function deletes the entire &lt;code&gt;.yml&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;simpsave&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;
&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__ss__.yml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Deletes the default file
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;SimpSave 4.0 is a simple, flexible, and lightweight library for persisting Python's basic data types using &lt;code&gt;.yml&lt;/code&gt; files. With its easy-to-use API, native Unicode support, and compatibility with all common data types, SimpSave is perfect for small-scale, low-complexity projects.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Explore more on &lt;a href="https://github.com/Water-Run/SimpSave" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>keyvalue</category>
      <category>beginners</category>
    </item>
    <item>
      <title>luaToEXE: Compile Lua Scripts to Standalone Windows Executables</title>
      <dc:creator>Water Run</dc:creator>
      <pubDate>Thu, 07 Aug 2025 13:03:13 +0000</pubDate>
      <link>https://forem.com/water_run_305f6dfd401fdaf/luatoexe-compile-lua-scripts-to-standalone-windows-executables-50nl</link>
      <guid>https://forem.com/water_run_305f6dfd401fdaf/luatoexe-compile-lua-scripts-to-standalone-windows-executables-50nl</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The standard method to compile a &lt;code&gt;.lua&lt;/code&gt; file into a standalone &lt;code&gt;.exe&lt;/code&gt; with a built-in interpreter and no environment dependencies is to use &lt;a href="https://github.com/LuaDist/srlua" rel="noopener noreferrer"&gt;srlua&lt;/a&gt;. However, srlua itself has not been updated for over a decade and does not provide precompiled binaries. Many community-compiled versions of srlua overlook dependency issues, resulting in missing DLL errors when running the compiled program on a machine without a Lua environment. Thus, it is not truly ready-to-use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;luaToEXE&lt;/code&gt; is an open-source project that wraps srlua, aiming to provide a simple solution for compiling &lt;code&gt;.lua&lt;/code&gt; files into &lt;code&gt;.exe&lt;/code&gt; files with a built-in interpreter.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ggon190sjbh0qdhs3ce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ggon190sjbh0qdhs3ce.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Features:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to use
&lt;/li&gt;
&lt;li&gt;The compiled &lt;code&gt;.exe&lt;/code&gt; has no dependencies (tested in Windows sandbox environments)
&lt;/li&gt;
&lt;li&gt;Supports multiple Lua versions
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;The project consists of two sub-projects:&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/Water-Run/luaToEXE/tree/main/lua-to-exe" rel="noopener noreferrer"&gt;lua-to-exe&lt;/a&gt;: A Python library that provides API functions for conversion and a graphical user interface
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Water-Run/luaToEXE/tree/main/exelua" rel="noopener noreferrer"&gt;exelua&lt;/a&gt;: A command-line tool with both 32-bit and 64-bit versions
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Links:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Water-Run/luaToEXE" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/lua-to-exe/" rel="noopener noreferrer"&gt;PyPi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tutorial: lua-to-exe
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install using &lt;code&gt;pip install lua-to-exe&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tzts9m2svxbzm3bg33u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tzts9m2svxbzm3bg33u.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Import the package in your project with &lt;code&gt;import lua_to_exe&lt;/code&gt; (note the underscore)  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Graphical interface: Run &lt;code&gt;lua_to_exe.gui()&lt;/code&gt; to launch the GUI  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Includes file selection for input &lt;code&gt;.lua&lt;/code&gt; and output &lt;code&gt;.exe&lt;/code&gt;, and a convert button
&lt;/li&gt;
&lt;li&gt;Dropdown to select the Lua version (&lt;code&gt;-32&lt;/code&gt; means 32-bit, and so on)
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh96urhurvbvgys4ksita.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh96urhurvbvgys4ksita.png" alt=" " width="800" height="643"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;API: Call the &lt;code&gt;lua_to_exe()&lt;/code&gt; function

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;lua_to_exe(lua_file, exe_file, lua_version='5.1.5-64')&lt;/code&gt;. The arguments are the input &lt;code&gt;.lua&lt;/code&gt; file, the output &lt;code&gt;.exe&lt;/code&gt; file, and an optional Lua version (default is &lt;code&gt;5.1.5-64&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;all_available()&lt;/code&gt; to get a dictionary of all available Lua versions
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7agd26to897l2kqeqmfc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7agd26to897l2kqeqmfc.png" alt=" " width="800" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tutorial: exelua
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Download the appropriate version of &lt;code&gt;exelua&lt;/code&gt; from the &lt;a href="https://github.com/Water-Run/luaToEXE/releases/tag/exelua" rel="noopener noreferrer"&gt;Release&lt;/a&gt; page
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lviec92zlhe58iigngy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lviec92zlhe58iigngy.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extract and add the directory to your environment variables, then restart your computer. Make sure the &lt;code&gt;srlua&lt;/code&gt; folder is in the same directory
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsuw5h83yerf3t6ro5sg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftsuw5h83yerf3t6ro5sg.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the Windows terminal, run &lt;code&gt;exelua -v&lt;/code&gt;. If a version number is output, the installation was successful
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;exelua -h&lt;/code&gt; for usage help, and &lt;code&gt;exelua -list&lt;/code&gt; (the first run may take some time) to list all available versions
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzzg1kua8b154emo5br3h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzzg1kua8b154emo5br3h.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;exelua -c &amp;lt;input.lua&amp;gt; &amp;lt;output.exe&amp;gt; [-lua &amp;lt;version&amp;gt;]&lt;/code&gt; to perform the conversion. The parameters are: the input &lt;code&gt;.lua&lt;/code&gt; file path, the output &lt;code&gt;.exe&lt;/code&gt; file path, and the optional &lt;code&gt;-lua&lt;/code&gt; (if you want to specify the Lua version) and the corresponding version. For example, to convert &lt;code&gt;helloworld.lua&lt;/code&gt; to &lt;code&gt;helloworld.exe&lt;/code&gt;, the command can be &lt;code&gt;exelua -c helloworld.lua helloworld.exe&lt;/code&gt;, which uses the default &lt;code&gt;5.1.5-64&lt;/code&gt;/&lt;code&gt;5.1.5-32&lt;/code&gt; Lua interpreter version.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8l2uluqkv025mycenq2y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8l2uluqkv025mycenq2y.png" alt=" " width="800" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Star Request :-/
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Water-Run/luaToEXE" rel="noopener noreferrer"&gt;If this project has helped you, please consider giving it a Star :)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>lua</category>
      <category>python</category>
      <category>packaging</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
