Python 2.7 从主应用程序工作目录在子文件夹中查找my py模块

Python 2.7 从主应用程序工作目录在子文件夹中查找my py模块,python-2.7,Python 2.7,这个问题以前可能被问过,但我找不到 我在Linux机器上。我有一个从名为/avt的文件夹运行的py应用程序。(示例) 我没有写这段代码,它有大约12个模块。我是幸运的工程师,继承了这一烂摊子。 此应用程序导入此目录/avt/bin下的其他模块 我希望能够在/bin目录中找到我的模块,无论当前工作目录在哪里。有时应用程序会将dir更改为其他一些子文件夹,以执行某些文件I/O。然后应该返回,但有时似乎不会返回,因为代码将出错并显示“无此类文件或目录”错误。因此,每次在对/bin目录执行任何文件I/O

这个问题以前可能被问过,但我找不到

我在Linux机器上。我有一个从名为/avt的文件夹运行的py应用程序。(示例) 我没有写这段代码,它有大约12个模块。我是幸运的工程师,继承了这一烂摊子。 此应用程序导入此目录/avt/bin下的其他模块 我希望能够在/bin目录中找到我的模块,无论当前工作目录在哪里。有时应用程序会将dir更改为其他一些子文件夹,以执行某些文件I/O。然后应该返回,但有时似乎不会返回,因为代码将出错并显示“无此类文件或目录”错误。因此,每次在对/bin目录执行任何文件I/O之前,我都要测试工作目录。 例如,我想在/bin中创建文件,然后稍后打开这些文件并从中读取数据。如何测试以确保我当前的工作目录始终为/avt?如果它不是,那么它是ch.dir吗?注意:它还必须是可移植的代码,这意味着它必须在任何Linux机器上的任何目录结构上运行

我试过这个代码,但我认为它不是很干净。Python不是我的主要语言。这个编码正确吗?它能工作吗?原谅我,我不知道如何格式化这个论坛

Avtfolder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
if Avtfolder not in sys.path:
    sys.path.insert(0, Avtfolder)

if Avtfolder.__contains__('/avt'): 

    modfilespath = Avtfolder + '/bin'
    print 'bin dir is ' + modfilespath
else:
    print 'directory lost...'
#write some code here that changes to the root /avt dir 
我有一些笔记

首先,我担心你混淆了两个问题(或者我无法从你面临的问题中分辨出哪一个)。这些问题是:

  • I/O到可以驻留在不同机器上不同目录中的文件
  • 导入应用程序使用的Python模块,这些模块也可以位于稍微不同的位置
  • 问题的标题和部分文本表明您正在处理问题2,而引用I/O和“没有这样的文件或目录”错误则指向问题1

    然而,这些是单独的问题,并且是单独处理的。我无法给出两者的确切配方,但以下是一些建议:

    对于问题1:我认为在用户安装Python库的文件夹中执行一些I/O、创建文件等操作不是一个好主意。它是Python模块的文件夹,而不是数据。此外,如果库是通过
    setup.py
    安装的,使用
    pip
    easy\u install
    (如果现在不是这样,将来可能会更改),那么程序可能没有足够的权限在那里写入,除非以
    根用户身份调用。没错。在其他地方创建文件

    至于“如何跟踪目录更改”部分:我必须承认我不太明白你的意思。你为什么还要使用“当前目录”的概念?在我看来,你应该有一些变量,比如
    write\u path
    data\u path
    ,等等,代码应该是

    data = open(os.path.join(data_path, 'data.foo'))
    dump = open(os.path.join(write_path, 'dump.bar'), 'w')
    
    等等

    你为什么关心你的图书馆在哪里?我认为这不对,我会改变的。这个
    inspect.currentframe()
    的东西闻起来好像你真的需要重新考虑库的设计

    现在,图书馆的位置对问题2有重要意义。但是,绝对路径也不重要(如果它真的重要,就改变它!)。您只需要将所有模块放在一个文件夹(或其子文件夹)中。如果它们在同一个文件夹中,你就很好了<代码>导入foo
    就可以了。如果其中一些在子文件夹中,那么这些子文件夹中应该有一个名为
    \uuuu init\uuuu.py
    的文件,然后Python解释器会将它们视为模块,因此您可以从foo import bar执行
    ,其中
    foo
    是一个子文件夹,其中包含
    \uuu init\uuuuuuuu.py
    bar.py


    因此,请尝试重写它,以便不依赖于
    .py
    文件的位置。您根本不需要在那里使用
    inspect
    。另一方面,除非您确实需要,否则不要直接使用特殊的方法,如
    \uuuu包含\uuuu
    <代码>如果Avtfolder中的“/avt”也会这样做。

    我想我还不清楚。是的,代码(您称之为我的库)位于名为/bin的子文件夹中。但是主app.py位于上面的一个文件夹中。在/bin文件夹中,我使用f=open(filename)创建了几个“temp”文件。然后我打开它们来解析数据,然后删除文件。有时,应用程序在找不到要打开的临时文件时会出错。不知怎的,它不知道它们位于/bin的子文件夹中。@David好的,我的意思是这不是个好主意。此外,如果文件最终被删除,您可以使用模块来清理。很好的建议,但我没有从这次对话中得到解决方案。这个项目有20多个.py文件,这些文件的前所有者使用了os.chdir()22次!是的,他跳得到处都是。我只是想清理一些,这样代码就不需要从一个文件夹跳到另一个文件夹。疯子我怎样才能给它一个解释路径?让它找到bin文件夹?对不起,我无知。我不太懂Linux,也不太懂python,只要创建了一个文件,就不要“忘记”它。将文件对象或至少文件路径保留在某个变量中,并在以后访问它。很抱歉,我无法给出更具体的建议,但我看不到代码。