【问题标题】:How to import a library with its local files?如何导入带有本地文件的库?
【发布时间】:2019-08-05 09:19:39
【问题描述】:

我正在尝试将我创建的库导入另一个 Python 脚本。当我导入它时,它无法在本地读取文件,这意味着它的文件路径已关闭。

我使用 Python3.6.6 Ubuntu 16.04

第一种方法

import sys
sys.path.append ("/home/myName/Desktop/myLibrary")

# myScript is in myLibrary
# it reads some files when being imported
import myScript

第二种方法

import importlib.util

spec = importlib.util.spec_from_file_location ("myLibrary", 
     "/home/myName/Desktop/myLibrary/myScript.py")
foo = importlib.util.module_from_spec (spec)
spec.loader.exec_module (foo)

我在这两种情况下得到的错误: FileNotFoundError: [Errno 2] File b'data/myFile.csv' does not exist: b'data/myFile.csv'

数据目录在 myLibrary 中。

当我在 myScript 中运行 os.getcwd() 时,我得到:

/home/myName/Desktop/myLibrary

当我导入 myScript 然后os.getcwd() 正在运行时,我得到:

/home/myName/Desktop/otherLibrary

知道为什么工作目录关闭了,我应该如何解决这个问题?

【问题讨论】:

    标签: python python-3.x import filepath sys


    【解决方案1】:

    os.getcwd() 不仅仅返回当前工作目录。它在您的环境中默认为 $PWD。这不是脚本所在的位置,而是您执行脚本时所在的位置。

    您可以通过相对路径解决它。 __file__ 提供运行文件的路径。 os.path.dirname 提供给定文件的目录。这意味着您可以获得运行 Python 文件的文件夹。因此,您可以根据 Python 文件的文件夹提供路径。

    例如:

    sys.path.append(os.path.join(os.path.realpath(os.path.dirname(__file__)), "your_relative_path", "your_python_file.py"))

    如果您正在运行的 Python 文件的路径是 /home/user/python_script/test.py,那么 /home/user/python_script/your_relative_path/your_python_file.py 路径将附加到您的路径中。

    仅供参考:

    如果您在import 之前使用此行,那么您将发出警告:(模块级导入不在文件顶部(E402))但您可以使用此注释行抑制此警告:... # noqa: E402

    【讨论】:

      【解决方案2】:

      特殊变量__file__ 始终包含脚本本身的完整路径。对于导入的模块也是如此。

      您可以使用它来查找一些本地数据文件。但是,这确实需要更改 module 文件以以不同的方式加载数据。这是一个演示它的基本示例(我假设是 Linux):

      我在/var/tmp 中创建了一个库目录myLibrary 和一个子目录data 供本地文件读取:

      mkdir -p /var/tmp/myLibrary/data
      

      然后,作为测试数据,我创建了一个文本文件:

      echo 'Hello from test file'  > /var/tmp/myLibrary/data/testfile.txt
      

      模块/var/tmp/myLibrary/myScript.py 如下所示:

      import os.path
      
      # Prepare path to data file realative to this module.
      #
      libdir = os.path.dirname(__file__)
      data_file_path = os.path.join(libdir, 'data/testfile.txt')
      
      # Open the file
      #
      my_data_file = open(data_file_path)
      
      # Read and show the data from the file
      #
      data = my_data_file.read()
      print(data)
      

      还有一个简单的脚本来导入这个模块。运行时,只需导入库模块即可打印数据文件的内容:

      import sys
      sys.path.append ('/var/tmp/myLibrary')
      import myScript
      

      【讨论】:

        猜你喜欢
        • 2020-03-26
        • 2021-12-26
        • 1970-01-01
        • 2020-11-07
        • 1970-01-01
        • 2020-06-19
        • 1970-01-01
        • 1970-01-01
        • 2013-09-11
        相关资源
        最近更新 更多