好的,试着找出运行Python包的问题。
在Windows上运行。
计算机上只安装了一个版本的Python:3.4.3
已安装包(包名:Willie)(安装细节比平时更复杂;如有必要可提供步骤)
软件包安装在:C:\Python34\Lib\site-packages\willie
启动脚本为:C:\Python34\Scripts\willie.py
错误是脚本的第一行:
from willie.tools import stderr
如果我从命令行运行willie.py,我会收到此错误:
Traceback (most recent call last):
File "<frozen importlib._bootstrap>", line 2218, in _find_and_load_unlocked
AttributeError: 'module' object has no attribute '__path__'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Python34\Scripts\willie.py", line 15, in <module>
from willie.tools import stderr
File "C:\Python34\Scripts\willie.py", line 15, in <module>
from willie.tools import stderr
ImportError: No module named 'willie.tools'; 'willie' is not a package
__path__
属性假设在使用import
函数时自动设置,但它不存在,导致程序无法运行执行。
C:\Python34\Scripts;
位于我的Path
环境变量中。
PYTHONPATH
到C:\Python34;
的所有内容设置了{p> C:\Python34;C:\Python34\Lib;C:\Python34\Lib\site-packages;C:\Python34\Lib\site-packages;C:\Python34\Lib\site-packages\willie;C:\Python34\Lib\site-packages\willie\tools;
。
在这些目录的所有情况下,如果我尝试从交互式Python提示符执行上述导入命令,它将正确运行。我可以使用stderr
函数,并检查其__file__
和__path__
字段。
但是,如果我将C:\Python34\Scripts;
添加到PYTHONPATH
,我会收到与在命令行中使用它相同的错误:__path__
不存在,&#39; willie& #39;不是一个包。
我知道以某种方式递归调用了willie.py,因为我可以在运行两次的文件顶部添加一个print()。
寻找帮助,找出如何进行此项运行。几乎可以肯定是我的配置问题,但我不知道如何解决它。
答案 0 :(得分:1)
首先,您绝对不希望c:\Python34\Scripts
中有PYTHONPATH
。 \Scripts
下的文件不是可导入的。
其次,willie
做了一些调整以确保willie.py
安装到c:\Python34\Scripts\willie
(注意没有.py
后缀)。这绝对是非标准的。这甚至可行的唯一原因是因为在Unix机器上,该文件的第一行是一个特殊的“shebang”,告诉Unix程序启动器使用Python执行该文件。 Windows上没有等效功能 - 将文件willie
命名为.py
表示您根本无法执行它。
因此看起来模块willie
根本不准备安装在Windows系统上。 (#811和#822都指的是非标准软件包设置导致Windows出现的奇怪现象。)
标准软件包设置willie.py
包中的willie
为willie/main.py
,并且在软件包的setup.py
中,将willie.main
注册为“入口点” “命名为willie
。当使用c:\Python34\Scripts\willie.exe
安装软件包时,此咒语将在Windows系统上创建pip
。
我认为递归导入的原因是因为sys.path
中的第二个条目是从命令行运行的脚本的名称。因此,当它找到不是它所需的模块C:\Python34\Scripts\willie.py
时,它始终会找到willie
。
作为解决方法,您可以尝试将C:\Python34\Scripts\willie.py
重命名为C:\Python34\Scripts\run-willie.py