[英]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.