簡體   English   中英

Python 導入和文件嵌入

[英]Python imports and file embebed

我正在處理一個導入多個包的項目,當腳本運行時,我加載了一個神經網絡模型。

我想知道以下是否可以實現:

  1. 如果我在另一個 python 環境中運行腳本,我需要安裝我導入的所有包。 有沒有可能避免這種情況? 這將消除第一次安裝所有軟件包的需要。
  2. 是否可以將神經網絡 .pb 嵌入到代碼中? 請記住,它重 80 mb,因此十六進制轉儲不起作用(帶有轉儲的文本文件重 700 mb)

我們的想法是擁有 1 個 .py,其中包含所有必要的內容。 是否可以?

謝謝!

如果我在另一個 python 環境中運行腳本,我需要安裝我導入的所有包。 有沒有可能避免這種情況?

嗯,不是真的,而是有點( TL;DR 不是,但取決於你的意思)。 它實際上只是歸結為環境的限制。 在某個地方,某個地方,您需要可以從磁盤中獲取它們的包——就這么簡單。 它們必須可用且可定位

可用,我的意思是可以通過文件系統訪問。 通過可定位,我的意思是必須有你正在尋找的地方 系統安裝會將其放置在可訪問的地方,並且可以可靠地用作安裝和查找包的地方。 這是您的虛擬環境責任的一部分。 唯一的區別是,您的虛擬環境將您與系統 Python 的包分開。

這樣做的好處是直接的:我可以創建一個使用包slamjam==1.2.3的虛擬環境,其中1.2.3是包slamjam的特定版本,並且還運行一個使用slamjam==1.7.9不會在我的全球環境中引起沖突。

所以這就是我給出“有點”氛圍的原因:如果您的用戶已經在您的系統上安裝了一個軟件包,那么您的用戶不需要安裝任何東西。 如果該軟件包已全局安裝在他們的系統上,則他們不需要該軟件包的虛擬環境。 同樣,如果它在另一個虛擬環境中,他們不需要新的,盡管將項目依賴項與一個分開是個好主意。

是否可以將神經網絡 .pb 嵌入到代碼中? 請記住,它重 80 mb,因此十六進制轉儲不起作用(帶有轉儲的文本文件重 700 mb)

所以,是的,實際上這是非常可行的。 問題是,這取決於你的意思。

如您所知,文件的十六進制轉儲會占用大量空間。 這是非常正確的。 但似乎您在談論原始十六進制,每個字節至少需要 2 個字節。 然后,如果您使用像hexdump 、 yada 、 yada yada 這樣的工具,您可能會傾倒額外的信息。

這個故事的寓意是,這樣做會浪費很多空間。 所以我會給你幾個選項,你可以選擇一個或多個。

  1. 如果可能,壓縮您的數據,甚至更多。

我沒有使用過 TensorFlow 數據,但是在快速閱讀之后,它似乎使用了 ProtoBufs 的壓縮,並且它可能已經被壓縮得很厲害了。 好吧,不管怎樣,去看看你能不能從水果中榨出更多的汁液。

  1. 獲取二進制數據,並將其轉儲為不同的編碼(提示,提示: base64 !)

看看當我們將某些東西轉換為十六進制時會發生什么......

>>> binary_data=b'this is a readable string, but really it just boils down to binary information. i can be expressed in a more efficient way than a binary string or hex, however'
>>> hex_data = binary_data.hex()
>>> print(hex_data)
746869732069732061207265616461626c6520737472696e672c20627574207265616c6c79206974206a75737420626f696c7320646f776e20746f2062696e61727920696e666f726d6174696f6e2e20692063616e2062652065787072657373656420696e2061206d6f726520656666696369656e7420776179207468616e20612062696e61727920737472696e67206f72206865782c20686f7765766572
>>> print(len(hex_data))
318

318個字符? 我們可以做得更好。

>>> import base64
>>> hex_data = binary_data.hex()
>>> import base64
>>> b64_data = base64.b64encode(binary_data)
>>> print(b64_data)
b'dGhpcyBpcyBhIHJlYWRhYmxlIHN0cmluZywgYnV0IHJlYWxseSBpdCBqdXN0IGJvaWxzIGRvd24gdG8gYmluYXJ5IGluZm9ybWF0aW9uLiBpIGNhbiBiZSBleHByZXNzZWQgaW4gYSBtb3JlIGVmZmljaWVudCB3YXkgdGhhbiBhIGJpbmFyeSBzdHJpbmcgb3IgaGV4LCBob3dldmVy'
>>> print(len(b64_data))
212

您現在已經將數據縮小了 33%!

  1. 使用.whl發行版打包非 Python 文件。 是的,完全可以。 我以前做過嗎? 不,從來不需要。 我會永遠嗎? 是的。 我對如何去做有很好的建議嗎? 不,但我有一個鏈接給你, 這是完全可行的。

  2. 您可以從應用程序中下載文件,並且只提供 URL。 一些快速簡單的東西,比如

import wget

file_contents_in_memory = wget.download('some.site.com/a_file`)

是的,當然還有其他類似請求的庫可以做類似的事情,但是例如,我選擇wget是因為它也有一個簡單的界面,並且始終是一個選項。

我們的想法是擁有 1 個 .py,其中包含所有必要的內容。 是否可以?

嗯,文件,是的。 對於您要問的問題 - 一個沒有其他東西可以安裝您的軟件包的.py文件? 如果您真的想將庫和所有數據復制和粘貼到一個沒人會下載的海量文件中,我相信有一種方法。

讓我們來看看您所要求的更受支持的方法: whl文件是一個文件,它可以包含安裝.whl所需的包的內部列表,它將為您處理所有事情(安裝、解包、等等)。 我會朝那個方向看。

無論如何,我知道很多信息,但是關於為什么你可以或不能做某事有一些邏輯。 希望對你有幫助,祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM