簡體   English   中英

從另一個目錄導入在 Python 中失敗

[英]Import from Another Directory is Failing in Python

我讀到要使用 python 文件作為導入模塊,我需要將__init__.py放在目錄中。

我有以下目錄結構:

data_load
    -- __init__.py
    -- rand_data.py

etc 
    -- __init__.py
    -- test.py

在 test.py 中,我導入了一個在 rand_data 中定義的 class ,我得到了錯誤:

python test.py 
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    from data_load.rand_data import RandData
ModuleNotFoundError: No module named 'data_load'

切換到 etc 和 data_load 的父目錄並輸入

python -m etc.test

這應該可以完成這項工作。

這里有一個小測試用例(假設你在 linux 機器上)

## create the test case
mkdir -p import_issue/data_load import_issue/etc
touch import_issue/data_load/__init__.py import_issue/etc/__init__.py
echo 'print("I am", __name__)' > import_issue/etc/test.py
echo 'from data_load.rand_data import RandData' >> import_issue/etc/test.py
echo 'print("Randdata = ", RandData)' >> import_issue/etc/test.py
echo "class RandData:" > import_issue/data_load/rand_data.py
echo '    pass' >> import_issue/data_load/rand_data.py
#
# now perform the test
cd import_issue
python -m etc.test

初始示例中的事情沒有按預期工作的原因是,您當前的工作目錄可能是etc ,如果您在 etc 中加載 python 腳本,那么它會嘗試導入相對於當前工作目錄的 load_data( etc )在etc下面沒有名為rand_data的目錄,其中有一個文件__init__.py

我建議修復 go 到公共父目錄(這現在將是您當前的工作目錄)並將 etc/test 作為模塊導入。 原因是, test.py 位於帶有init .py 的目錄 etc 中,因此您應該將其作為 etc.test 導入,而不是直接調用它。 不建議直接使用 etc/test.py 調用文件,即模塊,並且會引起一些罕見的混亂情況。

而不是在etc目錄中運行命令python test.pyetcdata_load的父目錄中運行 python 腳本。

即您需要在終端中做的是(考慮到您仍在終端的etc目錄中)

1.    `cd ..`
2.    `python etc/test.py`

這會奏效。

你為什么會遇到錯誤是因為在test.py python 正在當前目錄中查找data_load模塊,並且由於etc目錄中沒有 data_load 模塊,因此會出現此錯誤。

如何解決上述問題

  1. append 代碼中的 sys.path
  2. 從包含所有 package 和 python 模塊和腳本的項目主文件夾運行腳本。

暫無
暫無

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

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