【问题标题】:How to import files in python using sys.path.append?如何使用 sys.path.append 在 python 中导入文件?
【发布时间】:2015-08-27 10:07:32
【问题描述】:

我的桌面上有两个目录,DIR1DIR2,其中包含以下文件:

DIR1:
file1.py

DIR2:
file2.py  myfile.txt

文件包含以下内容:

file1.py

import sys

sys.path.append('.')
sys.path.append('../DIR2')

import file2

file2.py

import sys

sys.path.append( '.' )
sys.path.append( '../DIR2' )

MY_FILE = "myfile.txt"

myfile = open(MY_FILE) 

我的文件.txt

some text

现在,有两种情况。第一个有效,第二个给出错误。

场景 1

我将cd 转换为DIR2 并运行file2.py,它运行没有问题。

场景 2

cd 进入 DIR1 并运行 file1.py 并抛出错误:

Traceback (most recent call last):
  File "<absolute-path>/DIR1/file1.py", line 6, in <module>
    import file2
  File "../DIR2/file2.py", line 9, in <module>
    myfile = open(MY_FILE)
IOError: [Errno 2] No such file or directory: 'myfile.txt'

但是,这对我来说毫无意义,因为我已使用命令 sys.path.append('../DIR2') 将路径附加到 file1.py

为什么当file1.pyfile2.pymyfile.txt 位于同一目录时会发生这种情况,但它会引发错误?谢谢你。

【问题讨论】:

  • Python 的 sys.path 只影响 Python 查找模块的方式。如果你想open 一个文件,sys.path 是不涉及的。您的 open 失败,因为您没有从包含 myfile.txt 的目录中运行脚本。
  • 好的,谢谢@larsks。但是,我如何影响 python 打开文件的方式?即我如何允许它从不同的目录打开文件?
  • @Hunle 使用该文件的完整相对路径,或者尽可能使用绝对路径。
  • 您从未向我们展示过您是如何运行文件的。如果您在运行file2 之前更改为DIR2,这将解释您所看到的行为。如果您正在做其他事情,请向我们展示确切步骤。
  • 这个问题的标题具有误导性,因为它是关于open,而不是import。在 Google 上搜索如何使用 sys.path.append() 导入的人会发现这篇文章是在浪费时间 - 而大部分流量可能来自那里。

标签: python python-2.7 relative-path filepath sys


【解决方案1】:

您可以使用模块的__file__ 属性创建相对于模块的路径。例如:

myfile = open(os.path.join(
    os.path.dirname(__file__),
    MY_FILE))

无论你从哪里开始你的脚本,这应该做你想做的事。

【讨论】:

  • 我会先打印出路径的值 (thepath = os.path.join( os.path.dirname(__file__)+'/../&lt;different-directory&gt;/', JSON_FILE)),然后看看它是否正常。我怀疑我们在这里处理的是XY problem,因为从你的问题中不清楚你为什么要尝试访问这样的文件。
  • 我想通了。感谢您的帮助。
【解决方案2】:

替换

MY_FILE = "myfile.txt"
myfile = open(MY_FILE) 

MY_FILE = os.path.join("DIR2", "myfile.txt")
myfile = open(MY_FILE) 

这就是您的问题所指的 cmets 所指的相对路径解决方案。这假设您是从 myfile.txt 的第一个目录运行它...所以不理想。

如果您知道 my_file.txt 总是与 file2.py 位于同一目录中,那么您可以在 file2 中尝试类似的操作。

from os import path

fname =  path.abspath(path.join(path.dirname(__file__), "my_file.txt"))
myfile = open(fname)

【讨论】:

  • 我可以建议您在每个文件中调用 print(__file__ + " " + os.getcwd()) .. 我认为您可能对路径的解析方式有一个错误的理解.
猜你喜欢
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2023-01-06
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2020-10-21
相关资源
最近更新 更多