0

这个问题以前可能有人问过,但我找不到。

我在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 
4

1 回答 1

1

我有一些笔记。

首先,恐怕您混淆了两个问题(或者我无法从问题中分辨出您所面临的问题)。这些问题是:

  1. 对可以驻留在不同机器上不同目录中的文件的 I/O
  2. 导入您的应用程序使用的 Python 模块,这些模块也可能位于稍微不同的位置。

问题的标题和一些文本表明您正在处理问题 2,而对 I/O 和“没有这样的文件或目录”错误的引用指向问题 1。

然而,这些是单独的问题,需要单独处理。我无法给出两者的确切食谱,但这里有一些建议:

对于问题 1:我认为在用户安装 Python 库的文件夹中执行一些 I/O、创建文件等不是一个好主意。它是 Python 模块的文件夹,而不是数据。此外,如果库是通过setup.py、 using pipor安装的easy_install(如果现在不是这种情况,将来可能会改变),那么程序可能没有足够的权限在此处写入,除非调用为root. 没错。在其他地方创建文件。

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

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

等等

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

现在,图书馆的位置重要的是问题 2。但同样,绝对路径无关紧要(如果确实如此,请改变它!)。您只需要将所有模块都放在一个文件夹(或其子文件夹)内。如果它们在同一个文件夹中,那很好。import foo会工作的。如果有些在子文件夹中,则这些子文件夹中应该有一个名为的文件__init__.py,然后它们将被 Python 解释器视为模块,因此您将能够做到from foo import bar,其中包含和foo的子文件夹在哪里。__init__.pybar.py

因此,请尝试重写它,以便您不依赖.py文件的位置。你真的根本不需要在inspect那里使用。另一方面,__contains__除非你真的需要,否则不要使用像直接这样的特殊方法。if '/avt' in Avtfolder也会这样做。

于 2012-06-07T21:11:52.330 回答