2017-03-09 52 views
0

我正在使用Emacs Org模式的Babel源代碼塊來編寫和使用一些小函數。現在我想做更多一點。說一段時間後,我發現我在Org-babel中編寫的函數對於重用很有價值,我想將它放到我的個人python軟件包中,例如my_tools。結合來自不同文件的源代碼

所以org-babel提供了源代碼的提取,可以說,我已將源代碼提取到名爲examples.py的文件中,該文件在文件中有func1func2。我想將這些功能添加到名爲my_functions.py Python文件/模塊,有一個Python包或最佳實踐做這樣的事情,所以的func1的源代碼,func2將被插入到該模塊?

對我來說,這是我想要做的一段時間,通常,在使用python時,我們只是編寫一次性代碼,稍後我們可能會發現一些代碼/函數被重複使用,因此我們希望將其保存到一個包中,以便它可以輕鬆安裝並與其他人共享。

我們甚至可以向代碼添加標籤,以便在提取並將其插入到程序包模塊時,它會根據標籤信息知道插入的位置。我在這裏有點模糊不清,是否已經有PyPI包用於這種場景,或者如果我想爲自己構建這樣的包,應該如何構建包。我不是那麼有經驗,並且希望聽到關於這方面的意見。

+0

這似乎是一個奇怪的要求。爲什麼不直接在模塊中寫入函數? –

+0

@ juanpa.arrivillaga我認爲他只是在談論製作一個pip可安裝包,因爲這將回答他的問題。一旦他創建並安裝了軟件包,他將能夠在任何地方使用它的方法 – lordingtar

+0

@lordingtar由於我沒有使用Emacs Org模式Babel,我不完全確定OP需要什麼。但是,在我看來,他們希望以編程方式將來自單獨源文件的特定功能「剪切並粘貼」到新的封裝模塊中。 「我們甚至可以將代碼添加到代碼中,以便在提取並將其插入到程序包模塊時,它會根據標記信息知道要插入的位置。」 –

回答

0

我非常喜歡保持簡單。如果我正確理解了您的要求 ,您的主要興趣在於生成python源文件和 模塊,而不是執行python代碼,並將結果中使用的或 複製回org文件中。

如果是這種情況,我認爲你最好的辦法是隻有一個組織文件 它代表你的/工具/模塊。當你發現一個功能等你在不同的文件/項目中使用,並應該在你的工具 模塊中使用,將該功能代碼塊添加到代表您的工具 模塊(以及適當的文檔等)的組織文件中。然後,更新您的其他組織文件 ,這些文件代表程序的不同代碼塊,以加載該模塊 並引用該函數。

在代表你的工具模塊,你可以使用一些組織的 功能來執行代碼納入測試等等。這樣的組織文件,您可以 加載您的組織的文件,並執行其中的測試,以varify所有在您的模塊中的功能 功能正在工作。

在您的其他項目中,只需編寫源代碼塊即可從公用程序模塊獲取功能 。不要擔心使用org來嘗試引用或做其他事情。把事情簡單化。您可以使用組織鏈接將 引用到代表工具箱模塊的組織文件中,以獲取文檔 參考。

如果在另一方面,你想去的地方您從組織文件中的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'. 
0

這應該是可行的,使用源代碼「纏結」到文件和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應該是直截了當的,但是你所描述的更高級的方面(使用標籤來選擇函數,例如)當然不能解決這個問題(我不知道如何從我的頂部頭)。