gpt4 book ai didi

Python:程序不会在其他目录中运行

转载 作者:行者123 更新时间:2023-12-01 04:43:06 26 4
gpt4 key购买 nike

我正在运行 ubuntu 12.04 并通过终端运行程序。当我位于当前目录中时,我有一个文件可以编译并运行,没有任何问题。下面的例子,

    david@block-ubuntu:~/Documents/BudgetAutomation/BillList$ pwd
/home/david/Documents/BudgetAutomation/BillList
david@block-ubuntu:~/Documents/BudgetAutomation/BillList$ python3.4 bill.py
./otherlisted.txt
./monthlisted.txt
david@block-ubuntu:~/Documents/BudgetAutomation/BillList$

现在,当我返回一个目录并尝试运行同一段代码时,我收到一条错误消息:ValueError: need more than 1 value to unpack。下面是当我运行上一个文件夹的示例代码,然后运行下面的示例代码时会发生什么。

    david@block-ubuntu:~/Documents/BudgetAutomation$ python3.4 /home/david/Documents/BudgetAutomation/BillList/bill.py 
Traceback (most recent call last):
File "/home/david/Documents/BudgetAutomation/BillList/bill.py", line 22, in <module>
bill_no, bill_name, trash = line.split('|', 2)
ValueError: need more than 1 value to unpack

代码,bill.py,如下。该程序从其所在的文件夹中读取两个文本文件,并将这些行解析为变量。

#!/usr/bin/env python
import glob

# gather all txt files in directory
arr = glob.glob('./*.txt')
arrlen = int(len(arr))

# create array to store list of bill numbers and names
list_num = []
list_name = []

# for loop that parses lines into appropriate variables
for i in range(arrlen):
with open(arr[i]) as input:
w = 0 ## iterative variable for arrays
for line in input:
list_num.append(1) ## initialize arrays
list_name.append(1)

# split line into variables.. trash is rest of line that has no use
bill_no, bill_name, trash = line.split('|', 2)

# stores values in array
list_num[w] = bill_no
list_name[w] = bill_name

w += 1

这是怎么回事?我没有在终端中正确运行编译和运行命令吗?另一个需要注意的是,我最终从另一个文件调用此代码,并且它不会运行 for 循环,我假设它不会运行,除非从它自己的文件夹/目录调用它?

最佳答案

eomer explains ,问题在于 './*.txt' 是相对路径——相对于当前工作目录。如果您不是从所有这些 *.txt 文件所在的目录运行,您将找不到任何内容。

如果 *.txt 文件应该与脚本位于同一目录,请使用与脚本同一目录,不是当前工作目录

执行此操作的标准方法是将这样的代码放在脚本的顶部:

import os
import sys

scriptdir = os.path.abspath(os.path.dirname(sys.argv[0]))
  • argv[0]获取脚本本身的路径。因此,如果您将脚本作为 python BillList/bill.py 运行,则这将是 'BillList/bill.py'*

  • dirname只需获取文件路径,并为您提供文件所在目录的路径。因此,在本例中为 BillList

  • abspath标准化和绝对化路径。** 因此,您将得到 /home/david/Documents/BudgetAutomation/BillList/。这就是 *.txt 文件所在的目录。

然后,而不是这个:

glob.glob('./*.txt')

...你这样做:

glob.glob(os.path.join(scriptdir, '*.txt'))
<小时/>

* 实际上,在某些平台上,您会在这里获得绝对路径,而不是相对路径,这意味着后面的 abspath 是不必要的。但为了便携性,这是值得做的。一个更大的问题是,在某些情况下,您只会得到 bill.py,没有路径。过去在某些情况下值得检查并尝试 __file__ ,但据我所知,在任何现代平台上都不是这样 - 并且在某些情况下 __file__ 是错误的,但 argv[0] 是正确的。

** 对于相对路径,它将相对于当前工作目录绝对化。这就是为什么在脚本顶部执行此操作很重要 - 以防有人稍后执行 os.chdir

关于Python:程序不会在其他目录中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30114579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com