簡體   English   中英

從包內的父目錄導入模塊

[英]Import a module from the parent directory within packages

我已經提到了幾個主題和文章,包括:

卻得不到想要的結果。

假設我有一個名為“helloworld”的目錄:

helloworld
|--__init__.py
|--say_hello.py
|--another_hello
   |--__init__.py
   |--import_hello.py

這是 say_hello.py:

def hello_world():
    print("Hello World!")
if __name__ == "__main__":
    hello_world()

這是 import_hello.py:

from .. import say_hello
say_hello.hello_world()

我希望在我調用python /path/to/import_hello.py任何地方導入say_hello模塊而不使用sys module

但是,現在當我執行python /path/to/import_hello.py ,它將返回ValueError: attempted relative import beyond top-level package ,我不知道為什么它不起作用。

即使這不起作用:

from helloworld import say_hello
say_hello.hello_world()

它會給我ModuleNotFoundError: No module named 'helloworld'

你不能在這樣的包中間運行腳本。 當你這樣做,你沒有運行helloworld.another_hello.import_hello基於出/path/to/helloworldsparent/ ,你正在運行__main__基於出/path/to/helloworldsparent/helloworld/another_hello 因此,它沒有要import..的父包。


您可以使用-m運行模塊:

$ python -m helloworld.another_hello.import_hello

...假設helloworld的目錄在您的sys.path (例如,因為您已將其安裝到site-packages ,或者因為您當前的工作目錄是其父目錄,或者因為您已經設置了PYTHONPATH )。


但更簡潔的解決方案通常是不理會深層模塊,並在頂層編寫“入口點”腳本,如下所示:

import helloworld.another_hello.import_hello
helloworld.another_hello.import_hello.main()

如果您正在使用setuptools (並且您確實應該使用足夠復雜的任何東西以需要兩個級別的包),您可以讓它在安裝時(或在--inplace時,在開發期間)自動創建入口點腳本。 請參閱文檔中的自動腳本創建(但您可能還需要閱讀其他部分以了解整個想法;文檔非常大且復雜)。

我覺得你可以先嘗試將父路徑添加到系統路徑中,然后嘗試使用導入。

from sys import path as pylib
import os
pylib += os.path.abspath('..')
from helloworld import say_hello

希望能幫助到你 !!

暫無
暫無

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

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