【问题标题】:Python: Importing a package in another package without using the full pathPython:在另一个包中导入一个包而不使用完整路径
【发布时间】:2020-01-24 14:38:10
【问题描述】:

我有一些代码无法正确导入 [在 Linux 上]:

文件(每个 python 文件只包含一个同名和大写的类):

commandreader/
|-- CommandReader.py
|-- y/
    |-- Switch.py
    |-- Option.py
    |-- __init__.py
    |-- x/
        |-- InputArg.py
        |-- __init__.py

CommandReader.py 的导入:

from y import Switch
from y import Option

y/Switch.py​​ 和 y/Option.py 的导入:

from x import InputArg

y/__init__.py:

from .import x
from .Switch import Switch
from .Option import Option

y/x/__init__.py:

from .InputArg import InputArg

错误:

$ python3 ./CommandReader.py
Traceback (most recent call last):
  File "CommandReader.py", line 12, in <module>
    from y import Switch
  File "/home/swatts/code/commandreader/y/__init__.py", line 2, in <module>
    from .Switch import Switch
  File "/home/swatts/code/commandreader/y/Switch.py", line 8, in <module>
    from x import InputArg
ModuleNotFoundError: No module named 'x'

编辑:除了我的错误,我是否误解了 Python 希望包如何工作?因为这就是我的印象。

【问题讨论】:

  • 如果你改为运行python3 -m CommandReader 会发生什么?我建议先使用绝对导入,然后在一切正常后最终切换到相对导入。最终在一个相对相似的问题上看到这个答案:stackoverflow.com/a/59768291/11138259

标签: python import module package pythonpath


【解决方案1】:

一个解决方案是,你可以在环境变量中添加模块的路径:

Path中添加路径,在Environmental Variable

如果您使用的是Windows

  1. 右键单击My Computer 并转到Properties
  2. 选择Advanced system settings
  3. 转到标签Advanced
  4. 点击Environment Variables
  5. System Variables 部分搜索Path 变量
  6. 双击它并将路径添加到其value字段的列表中。

您也可以使用代码:

import sys
sys.path.append(path)
print(sys.path)

【讨论】:

  • 我使用的是 Linux,只是为了让它工作而更改环境变量似乎不是矫枉过正,还是我只是误解了 Python 希望如何完成包?
  • 如果您不想更改环境变量,则需要在代码中指定模块的路径,因为 python 需要该模块的引用,例如模块来自哪里。检查此链接.这可能会帮助你。 docs.python.org/3/tutorial/modules.html
  • Gotcha,所以 Python 不支持导入,因为我试图以类似于 Java 的方式进行。
  • 我真的怀疑是否有必要执行这些步骤。据我所知,(几乎)不需要修改sys.path 或环境变量PYTHONPATH。相反,在这种情况下,最好使用python -m CommandReader 运行代码,并将所有导入更改为绝对导入。然后最终一旦稳定,如果需要,逐步改回相对导入。
猜你喜欢
  • 2018-05-15
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多