从 python 脚本运行命令时肯定存在的文件出现 FileNotFoundError

问题描述 投票:0回答:1

我需要执行 FITS 文件的连续串联(或所有文件的一个大串联),因为手动执行它们是一个糟糕的主意(大约 200 个文件)。我正在使用 Python 编写脚本,然后在命令行上使用

python3 code.py
在 WSL/UNIX 终端中运行它。

该脚本访问子文件夹(称为

vvv_tiles_no_overlap
)中的 ascii 表。由于我在 Windows 11 PC 上的 WSL 上运行脚本以进行故障排除,并在远程服务器上的 UNIX 终端上运行脚本以进行实际工作,因此我使用
os.getcwd()
os.path.join()
创建脚本用于访问文件。到目前为止,代码成功完成了以下任务:

  1. 使用
    awk
    ,访问子文件夹中的文件并在同一目录中创建临时 CSV 文件 (
    tmp.csv
    )。
  2. 使用
    stilts
    ,将
    tmp.csv
    转换为 FITS (
    tmp.fits
    )。
  3. 运行
    stilts
    命令将本地目录与远程目录进行交叉匹配,并将其保存为子文件夹中的单独 FITS 文件。

到目前为止,代码在访问文件和执行所需操作时没有任何问题。每个命令都使用

subprocess.call()
调用。然后,我要求脚本读取在子文件夹中创建的每个适合文件并将它们连接起来。当代码到达该点时,我得到以下内容
FileNotFoundError
:

Exception in thread Thread-1 (process):       | time passed: 00:00:00
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/mnt/d/2023-2/awker-stiltser.py", line 183, in process
    subprocess.call(f'stilts tcat lazy=True in="{Ft_paths[0]} {Ft_paths[1]}" out=VVVxGAIA.fits')
  File "/usr/lib/python3.10/subprocess.py", line 345, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/lib/python3.10/subprocess.py", line 971, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/lib/python3.10/subprocess.py", line 1863, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'stilts tcat lazy=True in="vvv_tiles_no_overlap/VVVxGAIA_b201.fits vvv_tiles_no_overlap/VVVxGAIA_b202.fits" out=VVVxGAIA.fits'

(路径似乎不是绝对的,因为我更改了代码以查看

os
是否以某种方式导致了问题,但我向您保证它没有任何改变。)

我不明白代码本身生成路径时怎么找不到文件。我仔细检查并最终运行了

FileNotFoundError
报告的相同调用:

stilts tcat lazy=True in="vvv_tiles_no_overlap/VVVxGAIA_b201.fits vvv_tiles_no_overlap/VVVxGAIA_b202.fits" out=VVVxGAIA.fits

命令运行没有问题,我得到了预期的结果。什么可能导致这个问题?

python awk terminal subprocess
1个回答
0
投票

当我仔细检查以检查我的问题是否清楚时,我注意到我没有将

shell=True
添加到子流程调用中。我确实为此损失了两天的工作。我希望这可以帮助任何需要它的人。我计划用我的代码链接到 Pastebin,但我觉得不再需要了。

© www.soinside.com 2019 - 2024. All rights reserved.