如何在Python中将当前运行文件的作用域更改为其父文件夹

eqoofvh9  于 2023-06-25  发布在  Python
关注(0)|答案(1)|浏览(97)

我需要更改当前运行的python文件的路径,使其指向其父文件夹。
我必须创建一个包,它封装从子目录导入功能的代码,同时代码需要从子目录中可执行。
我有下面的代码

|--device1
|  |--ControlModule
|  |  |--control.py
|  |--ViewModule
|  |  |--view.py
|  |--main.py
| 
|--device2
|  |--ControlModule
|  |  |--control.py
|  |--ViewModule
|  |  |--view.py
|  |--main.py

每个www.example.com从相应的模块导入控制功能。main.py imports the control functions from the corresponding modules.
文件:* device [1 - 2]/www.example.com * main.py *

from ControlModule.Controller import control

然后,模块按以下方式相互导入函数
文件:* device [1 - 2]/ControlModue/www.example.com * control.py *

form ViewModule.views import Viewer

然后,该程序在每个设备上使用 * main.py * 运行,并且工作正常。我需要保留这个功能--从每个子目录运行的 * main.py * 应该运行相应设备的代码。
我的任务是将此代码打包到一个包含所有设备的包中。我在父目录中创建了一个包,如下所示:

|--all_devices  
   |--device1
   |  |--ControlModule
   |  |  |--control.py
   |  |--ViewModule
   |  |  |--view.py
   |  |--main.py
   | 
   |--device2
   |  |--ControlModule
   |  |  |--control.py
   |  |--ViewModule
   |  |  |--view.py
   |  |--main.py
   |
   |--pyproject.toml
   |--testme.py

这样做时,我必须调整www.example.com和www.example.com文件,以便它们指向正确的设备。control.py and view.py files, so that they point to the correct devices. This means the following adaptations
文件:* device1/www.example.com * ControlModule.py *

from device1.ViewModule.views import Viewer

文件:* device2/www.example.com * ControlModule.py *

from device2.ViewModule.views import Viewer

这样,当我将这个包(我称之为"all_devices")安装到一个虚拟环境中时,我只需调用

from device1.ControlMode.Controller import controll

而且很有效
然而,这样我就破坏了每个设备的 * www.example.com * 中的相对链接。main.py* for each device. Running /device1/main.py doesn't find the modules anymore - the interpreter is looking for device1.ViewModule.views, and it can't find it, as it is run from /device1/ directory already, so the path doesn't exist.
我试着用两种方法解决这个问题,但都失败了:
1.将 * main.py * 文件的“作用域”更改为父文件夹,以便导入的链接有意义。我尝试使用 * os.chdir("..")*--这不起作用(我猜这是因为我只改变了路径变量,而不是应用程序的实际作用域)
1.在模块中的包含之前做一个if case,以便使用正确的路径,这取决于程序是如何启动的。准确地说,我将其添加到device1/www.example.com ControleModule.py:

if __file__ == "main.py":
    form ViewModule.views import Viewer
else:
    from device1.ViewModule.views import Viewer

这也不起作用(这个想法是运行这个包的其他文件将永远不会被称为"www.example.com")main.py ")
我将非常感谢任何关于如何解决这个问题的想法。

pnwntuvh

pnwntuvh1#

我设法通过向导入添加相对路径来解决我的问题。我将这些行添加到每个 * main.py * 中

current = os.path.dirname(os.path.realpath(__file__))
parent = os.path.dirname(current)
sys.path.append(parent)
form device1.ControleModule.Controller import control

相关问题