import用法 - python互相import




將Python搜索路徑擴展到其他源 (4)

您還應該在這裡閱讀有關python包的內容: http://docs.python.org/tutorial/modules.htmlhttp://docs.python.org/tutorial/modules.html

從你的例子中,我猜你在~/codez/project確實有一個包。 python目錄中的文件__init__.py將目錄映射到命名空間。 如果您的子目錄都有__init__.py文件,那麼您只需要將基目錄添加到PYTHONPATH 。 例如:

PYTHONPATH = $ PYTHONPATH:$ HOME / adaifotis /項目

除了測試你的PYTHONPATH環境變量之外,正如David解釋的那樣,你可以在python中測試它,如下所示:

$ python
>>> import project                      # should work if PYTHONPATH set
>>> import sys
>>> for line in sys.path: print line    # print current python path

...

我剛剛加入了一個擁有相當大的現有代碼庫的項目。 我們在linux中開發並且不使用和IDE。 我們通過命令行運行。 我正在試圖弄清楚如何在運行項目模塊時讓python搜索正確的路徑。 例如,當我運行類似於:

python someprojectfile.py

我明白了

ImportError: no module named core.'somemodule'

我得到了所有我的導入,我認為這是路徑的問題。

TLDR:

如何讓Python在import語句中搜索~/codez/project/以及* .py文件的所有文件和文件夾。


我找到的最簡單的方法是創建一個文件“any_name.pth”並將其放在您的文件夾“\ Lib \ site-packages”中。 你應該在任何安裝python的地方找到該文件夾。

在該文件中,放置要保留模塊以進行導入的目錄列表。 例如,在該文件中創建一行,如下所示:

C:\ Users \用戶例如... \實例

你可以通過在python中運行它來告訴它的工作原理:

import sys
for line in sys: print line

您將看到打印出的目錄,以及您可以導入的目錄。 現在,您可以輕鬆導入位於該目錄中的“mymodule.py”文件:

import mymodule

這不會導入子文件夾。 為此你可以想像創建一個python腳本來創建一個.pth文件,其中包含你定義的文件夾的所有子文件夾。 也許它在啟動時運行。


我讀這個問題尋找答案,並不喜歡他們中的任何一個。

所以我寫了一個快速而又髒的解決方案。 只需將它放在sys.path上的某個位置,它就會在folder下(從當前工作目錄)或在abspath下添加任何目錄:

#using.py

import sys, os.path

def all_from(folder='', abspath=None):
    """add all dirs under `folder` to sys.path if any .py files are found.
    Use an abspath if you'd rather do it that way.

    Uses the current working directory as the location of using.py. 
    Keep in mind that os.walk goes *all the way* down the directory tree.
    With that, try not to use this on something too close to '/'

    """
    add = set(sys.path)
    if abspath is None:
        cwd = os.path.abspath(os.path.curdir)
        abspath = os.path.join(cwd, folder)
    for root, dirs, files in os.walk(abspath):
        for f in files:
            if f[-3:] in '.py':
                add.add(root)
                break
    for i in add: sys.path.append(i)

>>> import using, sys, pprint
>>> using.all_from('py') #if in ~, /home/user/py/
>>> pprint.pprint(sys.path)
[
#that was easy
]

我喜歡它,因為我可以為一些隨機工具提供一個文件夾,而不是讓它們成為包或任何東西的一部分,並且仍然可以通過幾行代碼訪問它們中的一些(或全部)。


有幾種可能的方法可以做到這一點:

  • 將環境變量PYTHONPATH設置為以冒號分隔的目錄列表,以搜索導入的模塊。
  • 在您的程序中,使用sys.path.append('/path/to/search')添加您希望Python搜索導入模塊的目錄的名稱。 sys.path只是Python每次被要求導入模塊時搜索的目錄列表,您可以根據需要進行更改(儘管我不建議刪除任何標準目錄!)。 在Python啟動時,您放入環境變量PYTHONPATH任何目錄都將插入到sys.path
  • 使用site.addsitedir將目錄添加到sys.path 。 這與簡單附加的區別在於,當您使用addsitedir ,它還會查找該目錄中的.pth文件,並使用它們根據文件的內容向sys.path添加其他目錄。 有關更多詳細信息,請參閱文檔

您想要使用哪一種取決於您的情況。 請記住,當您將項目分發給其他用戶時,他們通常會以這樣的方式安裝它,即Python的導入器會自動檢測Python代碼文件(即包通常安裝在site-packages目錄中),所以如果你搞砸了代碼中的sys.path ,這可能是不必要的,甚至可能在該代碼在另一台計算機上運行時產生負面影響。 對於開發,我猜想設置PYTHONPATH通常是最好的方法。

但是,當您使用的東西只能在您自己的計算機上運行時(或者您有非標准設置時,例如有時在Web應用程序框架中),執行類似的操作並不罕見

from os.path import dirname
sys.path.append(dirname(__file__))




path