Python 从子模块调用时,对象无法正常工作

Python 从子模块调用时,对象无法正常工作,python,python-2.7,import,module,Python,Python 2.7,Import,Module,你好,索尔斯 这是一个有点复杂的问题,但希望与子模块中全局对象的更广泛使用有关 我正在使用一些商业软件,这些软件提供了一个python库,用于通过TCP与应用程序接口。(我想我不能发布他们库的代码。) 我在从子模块调用对象时遇到了一个问题,我认为它通常与全局变量或类似的变量有关。基本上,当子模块与所有其他模块(包括创建对象的模块)位于同一目录中时,对象的状态与预期相同。 但当我将有问题的子模块移动到子文件夹中时,它仍然可以访问该对象,但状态似乎已被更改,并且该对象与商业应用程序的连接不再起作用

你好,索尔斯

这是一个有点复杂的问题,但希望与子模块中全局对象的更广泛使用有关

我正在使用一些商业软件,这些软件提供了一个python库,用于通过TCP与应用程序接口。(我想我不能发布他们库的代码。)

我在从子模块调用对象时遇到了一个问题,我认为它通常与全局变量或类似的变量有关。基本上,当子模块与所有其他模块(包括创建对象的模块)位于同一目录中时,对象的状态与预期相同。
但当我将有问题的子模块移动到子文件夹中时,它仍然可以访问该对象,但状态似乎已被更改,并且该对象与商业应用程序的连接不再起作用

根据关于全球VAR的一些建议,我将模块的文件组织为:

scriptfile.py
pyFIMM/
    __init__.py            # imports all the other files
    __globals.py           # creates the connection object used in most other modules
    __pyfimm.py            # main module functions, such as pyFIMM.connect()
    __Waveguide.py         # there are many of these files with various classes and functions
    (...other files...)
    PhotonDesignLib/
        __init__.py        # imports all files in this folder
        pdPythonLib.py     # the commercial library
    proprietary/
        __init__.py        # imports all files in this folder
        University.py      # <-- The offending child-module with issues
子文件夹“PhotonDesignLib”和“privative”中的
\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuupy
都会导致导入子文件夹中的所有文件,因此,例如,
scriptfile.py
将访问我的专有文件,如下所示:
import pyFIMM.privative.University
。这是通过以下方式实现的,在
专有/\uuuu init\uuuuuuuuupy
中编码:

import os, glob
__all__ = [ os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(__file__)+"/*.py")]
(来自几个不同机构的众多编码人员将拥有自己的专有代码,因此我们可以共享基本代码,但以这种方式保留我们的专有文件/函数,而不必更改任何基本代码/导入语句。我现在意识到,对于更静态的
PhotonDesignLib
文件夹,这是过分的。)

文件
\uuuu globals.py
创建了我需要用来与他们的商业应用程序通信的对象,使用此代码(此文件中的所有代码):

(仅供参考,因此有人指出,
inspect
优于
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

为什么您认为子模块位于子文件夹中会导致对象失去其状态?

我怀疑问题在于我指示
University.py
导入
\uuuu globals.py
的方式,或者是我在
propertial/\uuuu init\uuuuuu.py
中使用的“导入此文件夹中的所有文件”方法。但我不知道如何修复它


感谢您查看此问题,并提前感谢您的见解。

我怀疑您遇到了问题描述:
\uu global
通过两个不同的路径导入了两次,因为您直接将其添加到路径中。你展示的进口代码非常巴洛克风格。你为什么要做那些
sys.path
操作?如果
university
在所附的
pyFIMM
包中,它应该通过类似于
from.\uu globals import*
的相对导入来导入
globals
。我不知道你可以像Py2.7那样进行相对导入!我现在就试试……你的解决方案很有效!另外,您对从两个不同路径导入的评论非常好-我当然没有想到这一点。如果你把它作为一个答案,我很乐意接受。至于我为什么使用古老的
sys.path
操作,似乎是你展示的
。\uu mod
技术,所以我多年来一直使用巴洛克方法。我谦恭地向你的巨蟒技艺致敬!8小时的挫折感在发布后10分钟内结束,所以。。。太神了
import os, glob
__all__ = [ os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(__file__)+"/*.py")]
import PhotonDesignLib.pdPythonLib as pd    # the commercial lib/object
global fimm
fimm = pd.pdApp()      # <- - this is the offending global object
import sys, os, inspect
ScriptDir = inspect.currentframe().f_code.co_filename   # get path to this module file
(ParentDir , tail) = os.path.split(ScriptDir)       # split off top-level directory from path
(ParentDir , tail) = os.path.split(ParentDir)       # split off top-level directory from path
sys.path.append(ParentDir)        # add ParentDir to the python search path

from __globals import *         # import global vars & FimmWave connection object

global fimm         # This line makes no difference, was just trying it.