合并来自不同文件的源代码

时间:2017-03-09 19:08:50

标签: python emacs org-mode

我正在使用Emacs Org-mode Babel源代码块来编写和使用一些小函数。现在我想多做一点。说过一段时间后,我发现我在Org-babel中编写的函数对于重用很有价值,我想将它放入我的个人python包中,例如my_tools。

因此,org-babel提供了源代码的提取,比方说,我将源代码提取到名为NULL的文件中,该文件中包含examples.pyfunc1。我想将这些函数添加到名为func2的python文件/模块中,是否有python包或最佳实践来执行此类操作,因此将插入my_functions.pyfunc1的源代码进入模块?

对我而言,这是我试图做一段时间的事情,通常,在使用python时,我们只编写一次使用的代码,稍后,我们可能会发现一些代码/函数一次又一次地被重用,因此我们希望将其保存到包中,以便可以轻松地安装和共享。

我们甚至可以在代码中添加标签,以便在提取并将其插入包模块时,它根据标签信息知道要插入的位置。我在这里很模糊,知道是否已经存在这样的场景的PyPI包,或者如果我想为自己构建这样的包,我应该如何构建包。我不是那么有经验,我想听听有关这方面的意见。

2 个答案:

答案 0 :(得分:1)

这应该是可以使用源代码“纠缠”到文件和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进行纠缠,在foo子目录(必须已存在)中获取名为./tangled的文件,其内容为:

(message "Package stuff")
(princ "Hello")
(princ "Goodbye")

这个的pythonization应该是直截了当的,但是你所描述的更高级的方面(使用标签来选择函数,例如)肯定没有解决这个问题(而且我不知道如何将它们放在我的顶部。头)。

答案 1 :(得分:0)

我很擅长保持简单。如果我理解你的要求 正确地说,你的主要兴趣是生成python源文件和 模块而不是执行python代码并将结果用于或 复制回组织文件。

如果是这种情况,我认为您最好的办法就是拥有一个组织文件 代表你的/ tools / module。当你找到一个功能等你 继续使用不同的文件/项目,哪些应该进入你的工具 模块,将该功能代码块添加到代表您的工具的组织文件中 模块(以及适当的文档等)。然后,更新您的其他组织文件 它表示程序的不同代码块以加载该模块 并参考该功能。

在代表您的工具模块的组织文件中,您可以使用一些组织 执行代码以合并测试等的功能。这样,您就可以 加载您的组织文件并让它执行测试以变更所有实用程序 模块中的功能正在运行。

在您的其他项目中,只需编写源块以获取函数 从您的实用程序模块。不要担心使用组织尝试和幻想 引用等。把事情简单化。您可以使用组织链接来引用 到代表工具箱模块的组织文件以获取文档 引用。

另一方面,如果你想做像python实验室书籍系统那样的事情, 从组织文件中运行python代码并获取结果的位置 您用于文档或作为其他块的输入,那么您需要使用 一些先进的noweb功能,用于处理更复杂的块引用和 传递参数等你也可以找到babel库 有用。

  14.6巴别图书馆       =====================

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'.