使用多处理时从更高级别目录导入python

使用多处理时从更高级别目录导入python,python,python-2.7,Python,Python 2.7,我的python2应用程序是用run.py启动的,它位于我的顶级项目目录中。它为许多实验室仪器中的每一个启动一个子过程。每个子进程通过串行接口与其仪器通信,并使用zmq管道与控制器进程发送和接收消息。当run.py进程生成子进程和控制器进程时,它会将连接字符串传递给每个进程。所有进程共享一个名为zmq_endpoint的模块,该模块包含一个管理系统消息传递的类。zmq_endpoint.py也位于顶级项目目录中。控制器和仪器驱动程序位于子目录或项目目录的子目录中 project/ run

我的python2应用程序是用run.py启动的,它位于我的顶级项目目录中。它为许多实验室仪器中的每一个启动一个子过程。每个子进程通过串行接口与其仪器通信,并使用zmq管道与控制器进程发送和接收消息。当run.py进程生成子进程和控制器进程时,它会将连接字符串传递给每个进程。所有进程共享一个名为zmq_endpoint的模块,该模块包含一个管理系统消息传递的类。zmq_endpoint.py也位于顶级项目目录中。控制器和仪器驱动程序位于子目录或项目目录的子目录中

project/
    run.py
    zmq_endpoint.py
    ...
    controller/
        controller.py
        ...
    drivers/
        instrument_type1/
            instrument_driver_a.py
            instrument_driver_b.py
        instrument_type2/
            instrument_driver_c.py
我正在pyCharm中开发,并且已经屈服于分配源根和资源根标记来导航棘手的python导入过程的诱惑。当我部署到我的linux目标时,一切都会中断。生成的进程不能使用..模块导入表示法,因为它们是由具有的运行模块独立生成的

Popen(['python', 'module.py', 'connection1', 'connection2'])
所有子进程都找不到zmq_endpoint.py

我已经在导入最佳实践方面搜索了好几天,但没有找到有效的答案。到目前为止,我已经尝试了以下选项:

  • 将项目目录中包含zmq_endpoint.py的.pth文件添加到中指定的目录

    import site; site.getsitepackages()
    
  • 使用将项目目录添加到路径

    export PATH=$PATH:/home/project
    
  • 使用将项目目录添加到PYTHONPATH

    export PATH=$PATH:/home/project
    
    export PYTHONPATH=/home/project
    
  • 由于子流程之间的非系统性分布而失败的各种到sys.path的tweek

  • 这些都不管用。不确定正确答案是什么。zmq_endpoint.py代码是我项目的一部分,我真的希望避免将其作为包安装在站点包中

    另外,是否有任何应用程序分析器(如用于导入功能的lint)可以帮助诊断此问题空间?我有一些有用的python经验,但当我的应用程序变得更大时,它似乎太少了


    非常感谢您的见解。

    您只能使用来自..模块的
    导入。您的目录似乎不包含包,只有一堆脚本(no
    \uuuu init\uuuu.py
    ),因此,如果没有sys.path hack或类似工具,您无法从不同的目录导入。如果它们是包,您不应该直接以脚本的形式执行其中的文件,而应该使用
    python-m package.module…
    或者最好有一个中心入口点。不,
    popen
    在python中不是真正的多处理。要使用多核CPU的强大功能,请使用
    多处理
    模块,该模块的API与
    线程
    模块的API几乎相同。但是如何让这些子进程访问zmq_endpoint.py代码的目录级别?当然,有一种合适的方法可以做到这一点。