Python——PythonPath

Python——PythonPath,python,pythonpath,ubuntu-12.04,Python,Pythonpath,Ubuntu 12.04,我在ubuntu 12.04的主目录中创建了一个文件夹,并将所有python文件存储在那里。 我还将我的目录路径添加到pythonpath变量中。 但它不起作用。 以前的文件在主目录中时执行,但现在也不会执行 在Ubuntu终端中 manish@manish-笔记本电脑:~$echo$PYTHONPATH /家庭/曼尼什/项目: manish@manish-laptop:~$ ls -l /home/manish/project total 24 -rw-rw-r-- 1 manish mani

我在ubuntu 12.04的主目录中创建了一个文件夹,并将所有python文件存储在那里。 我还将我的目录路径添加到pythonpath变量中。 但它不起作用。 以前的文件在主目录中时执行,但现在也不会执行

在Ubuntu终端中 manish@manish-笔记本电脑:~$echo$PYTHONPATH /家庭/曼尼什/项目:

manish@manish-laptop:~$ ls -l /home/manish/project
total 24
-rw-rw-r-- 1 manish manish  140 May 31 00:07 Connection.py
-rw-rw-r-- 1 manish manish  122 May 29 11:29 Connection.py~
-rw-rw-r-- 1 manish manish 7150 May 31 00:07 Host.py
-rw-rw-r-- 1 manish manish 7132 May 30 23:30 Host.py~
`

从终端执行:

>>> import sys
>>> sys.path
['', '/home/manish/project', '/home/manish', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol', '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']
>>> import Host
>>> obj = Host()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
从空闲执行:

>>> import sys
>>> sys.path
['/usr/bin', '/home/manish/project', '/home/manish', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol', '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']
在Ubuntu终端中:

>>> import sys
>>> sys.path
['', '/home/manish/project', '/home/manish', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol', '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']
>>> import Host
>>> obj = Host()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable

由于
导入主机
没有给出错误,因此文件的定位、识别和导入都很好-PYTHONPATH没有问题。问题是您使用的导入模块错误

如果执行导入主机
import-Host
,则不是导入到全局名称空间,而是创建一个包含Host.py文件中所有名称的
Host
名称空间。因此,如果文件Host.py包含名为
Host
的类,或名为
some\u function
的函数,或名为
some\u global
的全局变量,则访问它们的方式如下:

>>> import Host
>>> obj = Host.Host()
>>> result = Host.some_function(1)
>>> x = Host.SOME_GLOBAL
这样行吗

您得到
'module'对象不可调用的错误的原因是,在此导入样式中,
Host
是模块的名称,即与整个Host.py文件相对应的对象,而不是Host.py文件中的
Host
类的名称。
Host
类的名称是
Host.Host
。请注意,这意味着您可以在一个文件中放置多个类/函数/etc,它们可以被命名为任何您想要的名称,它们不必以任何方式匹配文件名

或者,如果希望
Host
引用类而不是模块,则可以仅将特定名称从Host.py文件直接导入全局命名空间,如下所示:

>>> from Host import Host, some_function, SOME_GLOBAL
>>> obj = Host()
>>> result = some_function(1)
>>> x = SOME_GLOBAL
>>> import Host
或者,如果您想从全局命名空间中的Host.py获取所有名称,您可以这样做,但这通常不是一个好主意,因为您可能会意外地覆盖一些现有变量:

>>> from Host import *
>>> obj = Host()
>>> # etc
有关导入样式差异的更多信息:

正如我刚才所说的,
从主机导入*
样式通常被认为是不好的-您可能会在没有意识到的情况下覆盖一些现有变量,特别是如果您从不同的文件多次这样做的话。如果您只是在交互式python中玩,这可能是可以接受的(虽然经常不方便,请参见下一点),但在脚本中使用它会让维护变得非常烦人,因为无法快速检查代码中使用的特定类/函数是否来自
主机
模块或其他地方

还请注意,如果使用
导入主机
格式,则可以通过
重新加载(主机)
,对Host.py文件进行更改,并将其加载到交互式python shell中,而无需退出。如果使用其中一种
从主机
导入样式,则无法执行此操作

在任何情况下,都没有必要使用
execfile
来处理这种事情

更多信息:
-
-
-

答案的原始部分-只需询问更多信息:

首先,在使用python之前,请执行以下操作:

echo $PYTHONPATH
在壳里。它是否像您期望的那样包含
/home/manish/project
目录

接下来,发布

ls -l /home/manish/project
这样我们就可以确定它确实包含了你认为它包含的文件

如果到目前为止一切正常,请启动python。不要乱动execfile(为什么要这样做?),只需直接导入
/home/manish/project
中的一个文件,如下所示:

>>> from Host import Host, some_function, SOME_GLOBAL
>>> obj = Host()
>>> result = some_function(1)
>>> x = SOME_GLOBAL
>>> import Host
(不带“.py”扩展名)


会发生什么?请编辑您的问题以包含所有这些问题的输出(并对我的答案进行评论,以便我收到通知,如果您愿意的话)

更多信息请求:

如果
import Host
正常工作,请尝试以下命令,然后再次将输出粘贴到问题中:

>>> import sys
>>> sys.modules[Host.__name__].__file__
>>> obj = Host.Host()

sys.modules[Host.\uu name.\uuu].\uu文件\uuuu
的输出应该告诉您在导入主机时python正在读取什么文件-是您认为它应该读取的文件,还是其他文件?

请通过在问题中实际提供代码示例来描述您所做的工作。例如,您可能会这样写:“我向pythonpath变量添加了我的目录路径:
pythonpath=pythonfiles/foo.egg
”,我向.bashrc文件和.profile文件添加了export-pythonpath=/home/manish/project:$pythonpath,我正在执行以下命令行>>>execfile('Host.py')>>obj=Host()回溯(最近的调用最后一次):文件“”,第1行,在名称中错误:名称“主机”未定义。我建议使用将自定义软件包放置在其中,也可以在其中安装软件包。比起乱搞
PYTHONPATH
要好得多。如果要为项目使用不同的路径,只需在此处创建一个符号链接。请编辑您的问题,将您在注释中输入的信息包括在内,以便正确格式化。很难读懂回溯,所有回溯都被压缩成一行。@Manish-编辑答案,希望能解释发生了什么。扰流板:你的PYTHONPATH工作正常,你只是使用了
import
语句错误。如果上面的方法不起作用,请给我留言。嘿,weronika,我承认我使用它还不到一周。但是你告诉我导入模块的方法昨天已经被我尝试过了,它不起作用。事实上,我正在使用execfile()执行主机。我想你应该看到完整的问题。无论如何,谢谢你的尝试,但如果你能为我找到一个解决方案,那将非常有帮助。@Manish-我怎么知道你昨天尝试了什么?在您的问题中,没有任何地方表明您尝试过导入居屋