簡體   English   中英

如何從 Python 中的其他項目導入函數?

[英]How to import functions from other projects in Python?

我在一個項目中有一些代碼,我想在另一個項目中重用。 我需要做什么(在兩個文件夾中)才能做到這一點?

目錄結構類似於:

    • 項目1
      • 文件1.py
      • 文件2.py
  • 酒吧
    • 項目2
      • 文件X.py
      • 文件Y.py

我想在fileX.py 和fileY.py 中使用file1.py 和file2.py 中的函數。

理想情況下,這兩個項目都是一個可安裝的 python 包,充滿了 __init__.py 和 setup.py。 然后可以使用python setup.py install或類似方法安裝它們。

如果這是不可能的,請不要使用execfile() 操作PYTHONPATH以添加Foo以便import Project1.file1工作。

例如,來自 Project2/fileX.py:

from os import path
import sys
sys.path.append(path.abspath('../Foo'))

from Project1.file1 import something

然而,真正的答案是使每個都成為一個獨立的可安裝包。

這里發生了很多事情。 你應該閱讀關於 python 包和模塊管理http://docs.python.org/2/tutorial/modules.html#packages但基本思想是 fileX 需要知道 file1 和 file2 在哪里才能使用它們。

要將文件夾變成包,它只需要包含一個__init__.py文件。 我建議你做的是(在終端中)

$ touch Foo/__init__.py
$ touch Foo/Project1/__init__.py

(假設您使用的是 unix/linux)。

然后不知何故,fileX 需要知道Foo包在哪里。 您可以調用sys.path.append(PATH) ,其中 PATH 是 Foo 的位置。

最后在 fileX.py 里面你會有

import sys
sys.path.append(PATH) #replace PATH with the path to Foo

from Foo.Project1 import file1

#use its functions
file1.function_name(argument)

如果你真的只想說function_name而沒有前面的file1. 你可以通過from Foo.Project1.file1 import *來導入它的所有函數,但是注意from module import *非常不受歡迎的,因為它混合了名稱並使代碼更難閱讀和理解

您可能想從中制作一個模塊,然后從中導入您需要的任何內容。

您將要在兩個項目中使用的代碼放入一個模塊中,然后將其提取到第三個單獨的項目中。 你把那個項目打包成一個包,你可以單獨處理。 然后您發布它的版本,並在您的其他項目中重用它們。

重要的是你有你“發布”的版本,這樣你就可以跟蹤每個項目使用的模塊版本。 否則,您最終會遇到舊項目停止工作的情況,因為您對公共模塊進行了不兼容的更改。

如果它不僅對您而且對其他人都通用,請考慮將其上傳到PyPI

我認為您可以使用os.path.join()os.path.append()Foo添加到當前的 Python 路徑,並執行from import Project1.file1 import function_name

暫無
暫無

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

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