Python 3.x 导入问题

2024-04-20 02:17:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题可以概括如下。你知道吗

我有以下文件结构:

<path>/
- a.py
<path>/subdir/
- b.py
- c.py

关系是a导入b,b导入c(a->;b->;c)。你知道吗

更确切地说,每个文件的内容如下:

  • c、 py公司
def foo():
    print("Hello World!")
  • b、 py公司
import c
def fie():
    c.foo()
    print("Second Hello World!")
if __name__=="__main__":
    fie()
  • a、 py公司
from subdir import b
b.fie()

我想要的是调用a.py将打印这些字符串,即:

$ python3 a.py
Hello World!
Second Hello World!
$ 

从/subdir调用b.py将打印相同的内容:

$ cd subdir
$ python3 b.py
Hello World!
Second Hello World!
$ 

相反,如果我从<path>调用a.py,我有:

$ python3 a.py
Traceback (most recent call last):
  File "a.py", line 1, in <module>
    from subdir import b
  File "<path>/subdir/b.py", line 1, in <module>
    import c
ModuleNotFoundError: No module named 'c'
$ 

相反,如果我从<path>/subdir调用b.py,我就有了预期的行为:

$ cd subdir
$ python3 b.py
Hello World!
Second Hello World!
$ 

如果我按以下方式更改b.py:

  • b、 py公司
from subdir import c
def fie():
    c.foo()
    print("Second Hello World!")
if __name__=="__main__":
    fie()

a.py的调用按预期工作,但这次是b.py的调用,它给出了ModuleNotFoundError

$ cd subdir
$ python3 b.py
Traceback (most recent call last):
  File "b.py", line 1, in <module>
    from subdir import c
ModuleNotFoundError: No module named 'subdir'
$ 

奇怪的是,即使是来自<path>的调用也会产生同样的错误:

$ python3 subdir/b.py
Traceback (most recent call last):
  File "b.py", line 1, in <module>
    from subdir import c
ModuleNotFoundError: No module named 'subdir'
$ 

如果替换b.py中的以下字符串:

from subdir import c

from . import c

我的效果和上次测试完全一样。你知道吗

在实际场景中,b和c都是subdir中自包含的库的一部分,该库既可以直接使用(使用if __name__技巧),也可以从其他任何地方导入以使用它们的函数。 所说的库目前不能安装在文件系统的固定空间中(或者至少我不应该依赖于此)。你知道吗

我在使用Python2.6时从来没有遇到过这样的问题,最近我正在迁移到Python3.x。阅读Python3.x导入指南很有帮助,但我没有找到任何有用的信息来解决这个问题,这应该是非常基本的(这就是为什么我认为我忽略了一些琐碎的东西)。你知道吗

您能建议一种方法来更改[a,b,c].py文件中的任何一个以覆盖这个用例吗?你知道吗


Tags: pathinfrompyimporthelloworldline
2条回答

以下是我的作品(至少在Windows下)。你知道吗

通过调用addpath启动主程序,将目录(作为字符串)或目录(作为字符串列表)作为参数,您希望应用程序可以访问这些目录:

def addpath(dirs):
  import sys,os
  my_path = '/'.join(os.path.abspath(sys.argv[0]).replace('\\','/').split('/')[:-1])+'/'
  if type(dirs) is str:
    sys.path.append(my_path+dirs)
  elif type(dirs) is list:
    for dir in dirs:
      sys.path.append(my_path+dir)

################################################################################

addpath('subdir')  #or addpath(['subdir1',...])

from subdir import b
b.fie()

我的目录结构如下: C:\Users\G1\Desktop\Test目录

30-06-2019  01:17                   a.py
30-06-2019  01:17    <DIR>          path/

 Directory of C:\Users\G1\Desktop\Test\path

30-06-2019  01:18                b.py
30-06-2019  01:15                c.py

a.py公司

import sys
**sys.path.append("path")**
from path import b
b.fie()

b.py公司

import c
def fie():
    c.foo()
    print("Second Hello World!")
if __name__=="__main__":
    fie()

c.py公司

def foo():
    print("Hello World!")

输出:

C:\Users\G1\Desktop\Test>python a.py
Hello World!
Second Hello World!

C:\Users\G1\Desktop\Test>python path\b.py
Hello World!
Second Hello World!

必须附加modulec.py的路径

以上代码也在python3和python2中进行了测试。你知道吗

相关问题 更多 >