合并来自不同文件的源代码
combine source code from different files
我正在使用Emacs Org-mode Babel 源代码块来编写和使用一些小功能。现在我想多做一点。说了一会儿,我发现我在Org-babel中写的函数有复用价值,我想把它放到我个人的python包里,比如my_tools。
所以 org-babel 提供源代码的提取,比方说,我将源代码提取到一个名为 examples.py
的文件中,其中有 func1
和 func2
文件。我想将这些函数添加到一个名为 my_functions.py
的 python file/module 中,是否有 python 包或最佳实践来做这样的事情所以 [=11= 的源代码], func2
会被插入模块?
对我来说,这是我一直在尝试做的事情,通常,在使用 python 时,我们只是编写一次性使用的代码,稍后,我们可能会发现一些 code/functions 一次又一次地重复使用,因此我们想将它保存到一个包中,以便于安装和与他人共享。
我们甚至可以在代码中添加标签,在提取和插入包模块时,根据标签信息知道插入到哪里。我在这里有点模糊,不知道是否已经有适用于这种情况的 PyPI 包,或者如果我想为自己构建这样的包,我应该如何构建该包。我不是那么有经验,想听听对此的意见。
这应该是可行的,使用 "tangling" 源代码到文件和 noweb
语法将各个部分收集成一个更大的整体。以下是该方法的说明:
* Individual code blocks
#+name: foo
#+BEGIN_SRC elisp
(princ "Hello")
#+END_SRC
and another one:
#+name: bar
#+BEGIN_SRC elisp
(princ "Goodbye")
#+END_SRC
* Combine them together
#+BEGIN_SRC elisp :tangle ./tangled/foo :noweb yes
(message "Package stuff")
<<foo>>
<<bar>>
#+END_SRC
用C-c C-v C-t
纠结,在./tangled
子目录(必须已经存在)下得到一个名为foo
的文件,其内容为:
(message "Package stuff")
(princ "Hello")
(princ "Goodbye")
这个的 pythonization 应该是直截了当的,但是你描述的更高级的方面(例如使用标签到 select 函数)肯定不会被这个解决(我不知道该怎么做他们离开了我的头顶)。
我非常喜欢让事情变得简单。如果我明白你的要求
正确地说,您的主要兴趣是生成 python 源文件和
模块而不是执行 python 代码并将结果用于或
复制回 org 文件。
如果是这种情况,我认为最好的方法是只拥有一个 org 文件
它代表你的 /tools/ 模块。当你找到一个功能等你
继续使用不同的 files/projects,哪些应该进入你的工具
模块,将该功能代码块添加到代表您的工具的 org 文件中
模块(以及适当的文档等)。然后,更新您的其他组织文件
它们代表您程序中用于加载该模块的不同代码块
并引用该功能。
在代表您的工具模块的 org 文件中,您可以使用 Org 的一些
执行代码以合并测试等的功能。这样,您可以
加载您的 org 文件并让它执行测试以验证所有实用程序
您模块中的功能正在运行。
在您的其他项目中,只需编写您的源代码块来为函数提供源代码
从您的实用程序模块。不要担心使用 org 来尝试做花哨的事情
引用之类的。把事情简单化。您可以使用组织链接来参考
到代表您的工具箱模块的 org 文件以获取文档
参考。
另一方面,如果您想做一些类似 python 实验书系统的事情,
你从 org 文件中 运行 python 编码并得到结果
您用于文档或作为其他块的输入,那么您需要使用
一些先进的 noweb 功能来处理更复杂的块引用和
传递参数等。您还可以找到 babel 库
有用。
14.6 Library of Babel
=====================
The "Library of Babel" is a collection of code blocks. Like a function
library, these code blocks can be called from other Org files. This
collection is in a repository file in Org mode format in the `doc'
directory of Org mode installation. For remote code block evaluation
syntax, *note Evaluating code blocks::.
For any user to add code to the library, first save the code in
regular `src' code blocks of an Org file, and then load the Org file
with `org-babel-lob-ingest', which is bound to `C-c C-v i'.
我正在使用Emacs Org-mode Babel 源代码块来编写和使用一些小功能。现在我想多做一点。说了一会儿,我发现我在Org-babel中写的函数有复用价值,我想把它放到我个人的python包里,比如my_tools。
所以 org-babel 提供源代码的提取,比方说,我将源代码提取到一个名为 examples.py
的文件中,其中有 func1
和 func2
文件。我想将这些函数添加到一个名为 my_functions.py
的 python file/module 中,是否有 python 包或最佳实践来做这样的事情所以 [=11= 的源代码], func2
会被插入模块?
对我来说,这是我一直在尝试做的事情,通常,在使用 python 时,我们只是编写一次性使用的代码,稍后,我们可能会发现一些 code/functions 一次又一次地重复使用,因此我们想将它保存到一个包中,以便于安装和与他人共享。
我们甚至可以在代码中添加标签,在提取和插入包模块时,根据标签信息知道插入到哪里。我在这里有点模糊,不知道是否已经有适用于这种情况的 PyPI 包,或者如果我想为自己构建这样的包,我应该如何构建该包。我不是那么有经验,想听听对此的意见。
这应该是可行的,使用 "tangling" 源代码到文件和 noweb
语法将各个部分收集成一个更大的整体。以下是该方法的说明:
* Individual code blocks
#+name: foo
#+BEGIN_SRC elisp
(princ "Hello")
#+END_SRC
and another one:
#+name: bar
#+BEGIN_SRC elisp
(princ "Goodbye")
#+END_SRC
* Combine them together
#+BEGIN_SRC elisp :tangle ./tangled/foo :noweb yes
(message "Package stuff")
<<foo>>
<<bar>>
#+END_SRC
用C-c C-v C-t
纠结,在./tangled
子目录(必须已经存在)下得到一个名为foo
的文件,其内容为:
(message "Package stuff")
(princ "Hello")
(princ "Goodbye")
这个的 pythonization 应该是直截了当的,但是你描述的更高级的方面(例如使用标签到 select 函数)肯定不会被这个解决(我不知道该怎么做他们离开了我的头顶)。
我非常喜欢让事情变得简单。如果我明白你的要求 正确地说,您的主要兴趣是生成 python 源文件和 模块而不是执行 python 代码并将结果用于或 复制回 org 文件。
如果是这种情况,我认为最好的方法是只拥有一个 org 文件 它代表你的 /tools/ 模块。当你找到一个功能等你 继续使用不同的 files/projects,哪些应该进入你的工具 模块,将该功能代码块添加到代表您的工具的 org 文件中 模块(以及适当的文档等)。然后,更新您的其他组织文件 它们代表您程序中用于加载该模块的不同代码块 并引用该功能。
在代表您的工具模块的 org 文件中,您可以使用 Org 的一些 执行代码以合并测试等的功能。这样,您可以 加载您的 org 文件并让它执行测试以验证所有实用程序 您模块中的功能正在运行。
在您的其他项目中,只需编写您的源代码块来为函数提供源代码 从您的实用程序模块。不要担心使用 org 来尝试做花哨的事情 引用之类的。把事情简单化。您可以使用组织链接来参考 到代表您的工具箱模块的 org 文件以获取文档 参考。
另一方面,如果您想做一些类似 python 实验书系统的事情, 你从 org 文件中 运行 python 编码并得到结果 您用于文档或作为其他块的输入,那么您需要使用 一些先进的 noweb 功能来处理更复杂的块引用和 传递参数等。您还可以找到 babel 库 有用。
14.6 Library of Babel =====================
The "Library of Babel" is a collection of code blocks. Like a function library, these code blocks can be called from other Org files. This collection is in a repository file in Org mode format in the `doc' directory of Org mode installation. For remote code block evaluation syntax, *note Evaluating code blocks::. For any user to add code to the library, first save the code in regular `src' code blocks of an Org file, and then load the Org file with `org-babel-lob-ingest', which is bound to `C-c C-v i'.