【问题标题】:How to specify an import path when the file is called from different directories?从不同目录调用文件时如何指定导入路径?
【发布时间】:2018-04-19 17:58:33
【问题描述】:

我遇到了一个与导入路径相关的问题。我有一个库文件(func_a.py),如下所示。这个文件是从不同的目录调用的。在这种情况下,如何在client.py中指定导入路径?

.
├── main.py
└── package_a
    ├── __init__.py
    ├── client.py
    └── func_a.py

代码如下:

$ cat package_a/func_a.py                                                                                                                                                                                                                        
def something():
    print('something')

$ cat package_a/client.py                                                                                                                                                                                                                       
import func_a

func_a.something()

$ cat main.py                                                                                                                                                                                                                                    import package_a.func_a as func_a
import package_a.client as client

func_a.something()

这是错误。当我调用 client.py 时,该文件缺少 func_a.py,因为当前目录是根目录,而不是 package_a/。

$ python main.py                                                                                                                                                                                                                                     Traceback (most recent call last):
  File "main.py", line 2, in <module>
    import package_a.client as client
  File "/home/jef/work/test/package_a/client.py", line 1, in <module>
    import func_a
ModuleNotFoundError: No module named 'func_a'

我的 python 是 3.6。感谢您的帮助。

更新

虽然调用main.py是可以的,但是调用client.py失败了。我让这两个工作。

$ cat client.py
from package_a import func_a

func_a.something()

$ python client.py        
Traceback (most recent call last):
  File "client.py", line 2, in <module>
    from package_a import func_a
ModuleNotFoundError: No module named 'package_a'

【问题讨论】:

    标签: python python-3.x import python-import


    【解决方案1】:
    $ cat package_a/client.py
    import func_a
    

    ^ 此导入语句不正确。要从 package_a 包中导入 func_a 模块,请改用以下导入语句:

    from package_a import func_a
    

    您需要确保包含package_a 的目录在sys.path 中可见。

    【讨论】:

    • 谢谢。我更新了我的帖子。我还想同时运行 main.py 和 client.py。
    • 正如我所提到的,您需要确保包含package_a 的目录在sys.path 中可见,并且您的新错误表明您没有这样做。至于client.py,将包的子模块作为脚本运行被认为是一种反模式。请考虑使用python -m package_a.client
    • 太棒了。这说得通。使用 m 选项会很好。
    • 我给我留下了useful link,因为我不熟悉 m 选项。
    猜你喜欢
    • 2011-09-24
    • 2014-06-14
    • 2020-03-28
    • 2013-07-08
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多