文章目录
- 一、如何看当前的目录?
- 二、Kaggle如何切换路径?
- 三、与包安装或设置有关的错误
- 四、如何把 Kaggle 上的 input 数据转到 output 中?
一、如何看当前的目录?
在 Linux 中,你可以使用 pwd
命令来查看当前所在的目录。“pwd” 代表 “Print Working Directory”,它会显示出当前工作目录的路径。
要查看当前目录,请按照以下步骤操作:
- 打开终端,以进入命令行界面。
- 输入 pwd 命令,然后按下回车。
- 系统将显示当前目录的绝对路径,例如 /home/user/Documents。这表示你当前位于名为 “Documents” 的文件夹下。
请注意,Linux 中的路径可以是相对路径或绝对路径。相对路径是相对于当前目录的路径,而绝对路径是从根目录开始的完整路径。pwd 命令始终显示绝对路径。
在Kaggle中的操作为:
!pwd
输出结果为:
二、Kaggle如何切换路径?
在 Kaggle 上,你可以通过以下步骤切换到输入数据的路径:
- 在 Kaggle 网站上打开你的 Kernel(或者 Notebook)。
- 点击右侧的 “Data” 选项卡,它会显示出可用的输入数据集。
- 在 “Data” 选项卡下,你会看到一个名为 kaggle 的目录。输入数据集通常会被挂载到此目录下。
- 使用以下命令切换到输入数据的路径:
import os
input_path = "/kaggle/input"
os.chdir(input_path)
这将把当前工作目录更改为输入数据的路径 /kaggle/input。现在你可以通过该路径访问输入数据集中的文件。
请注意,如果你使用的是 Kaggle Notebook,则输入数据集会自动挂载到 /kaggle/input 目录下。但是,如果你使用的是 Kaggle Kernel,则需要将输入数据集手动添加到 Notebook 设置中,并且在切换到输入数据路径之前,你需要等待输入数据集加载完成。
三、与包安装或设置有关的错误
我在安装包的过程中,用到了这样的命令:
!python -m pip install -e regionclip-main
但是代码报错:
Obtaining file:///kaggle/input/regionclip-main
Preparing metadata (setup.py) ... error
error: subprocess-exited-with-error
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [21 lines of output]
Traceback (most recent call last):
File "/kaggle/input/regionclip-main/setup.py", line 174, in get_model_zoo_configs
os.symlink(source_configs_dir, destination)
OSError: [Errno 30] Read-only file system: '/kaggle/input/regionclip-main/configs' -> '/kaggle/input/regionclip-main/detectron2/model_zoo/configs'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 2, in <module>
File "<pip-setuptools-caller>", line 34, in <module>
File "/kaggle/input/regionclip-main/setup.py", line 202, in <module>
package_data={"detectron2.model_zoo": get_model_zoo_configs()},
File "/kaggle/input/regionclip-main/setup.py", line 177, in get_model_zoo_configs
shutil.copytree(source_configs_dir, destination)
File "/opt/conda/lib/python3.10/shutil.py", line 559, in copytree
return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks,
File "/opt/conda/lib/python3.10/shutil.py", line 457, in _copytree
os.makedirs(dst, exist_ok=dirs_exist_ok)
File "/opt/conda/lib/python3.10/os.py", line 225, in makedirs
mkdir(name, mode)
OSError: [Errno 30] Read-only file system: '/kaggle/input/regionclip-main/detectron2/model_zoo/configs'
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed
× Encountered error while generating package metadata.
╰─> See above for output.
note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
这似乎是一个与包安装或设置有关的错误,而不是路径切换问题。以下是一些可能的解决方法:
- 检查输入数据集和依赖项: 确保你正确添加了输入数据集,并且依赖项和所需的文件都在正确的位置。可能有一些文件或配置缺失或被放置在了不正确的位置。
- 检查文件系统权限: 错误信息中提到了 “Read-only file system”,这可能意味着你没有足够的权限在该路径下创建或修改文件。在 Kaggle 上,输入数据集通常是只读的,因此你可能无法修改其中的文件。你可以尝试将文件复制到其他目录中,并在该目录下进行操作。
- 联系包的作者或提供者: 错误信息中还提到了 setup.py 文件的错误,这可能是包的安装过程中出现了问题。
四、如何把 Kaggle 上的 input 数据转到 output 中?
在 Kaggle 上,你可以使用以下步骤将输入数据转移到输出目录中:
- 在 Kaggle 网站上打开你的 Kernel(或者 Notebook)。
- 在 Notebook 中,通过以下代码获取输入数据的路径:
import os
import shutil
input_path = "/kaggle/input"
- 然后,使用以下代码创建一个输出目录并将输入数据复制到输出目录中:
output_path = "/kaggle/working/output"
os.makedirs(output_path, exist_ok=True)
# 复制输入数据到输出目录
input_files = os.listdir(input_path)
for file in input_files:
source = os.path.join(input_path, file)
destination = os.path.join(output_path, file)
shutil.copyfile(source, destination)
以上代码会在输出目录 /kaggle/working/output 中创建与输入数据相同的文件,并将输入数据复制到输出目录中。你可以根据需要修改输出目录的路径。
请确保你有足够的磁盘空间来存储复制的文件,并注意一些大型文件可能需要较长的时间进行复制。
完成后,你可以在输出目录中访问并处理这些数据。
发现报错:
IsADirectoryError: [Errno 21] Is a directory: '/kaggle/input/regionclip-main'
完整的报错信息为:
---------------------------------------------------------------------------
IsADirectoryError Traceback (most recent call last)
Cell In[8], line 13
11 source = os.path.join(input_path, file)
12 destination = os.path.join(output_path, file)
---> 13 shutil.copyfile(source, destination)
File /opt/conda/lib/python3.10/shutil.py:254, in copyfile(src, dst, follow_symlinks)
252 os.symlink(os.readlink(src), dst)
253 else:
--> 254 with open(src, 'rb') as fsrc:
255 try:
256 with open(dst, 'wb') as fdst:
257 # macOS
IsADirectoryError: [Errno 21] Is a directory: '/kaggle/input/regionclip-main'
这个错误表明你正在尝试复制一个目录而不是一个文件。shutil.copyfile() 函数用于复制文件,而不是目录。
如果你想将整个输入目录复制到输出目录中,你可以使用 shutil.copytree() 函数来完成。以下是更新后的代码示例:
import os
import shutil
input_path = "/kaggle/input/regionclip-main"
output_path = "/kaggle/working/output"
shutil.copytree(input_path, output_path)
使用 shutil.copytree() 函数,你可以直接复制整个目录,包括其中的文件和子目录。
再次报错:
---------------------------------------------------------------------------
FileExistsError Traceback (most recent call last)
Cell In[9], line 7
4 input_path = "/kaggle/input/regionclip-main"
5 output_path = "/kaggle/working/output"
----> 7 shutil.copytree(input_path, output_path)
File /opt/conda/lib/python3.10/shutil.py:559, in copytree(src, dst, symlinks, ignore, copy_function, ignore_dangling_symlinks, dirs_exist_ok)
557 with os.scandir(src) as itr:
558 entries = list(itr)
--> 559 return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks,
560 ignore=ignore, copy_function=copy_function,
561 ignore_dangling_symlinks=ignore_dangling_symlinks,
562 dirs_exist_ok=dirs_exist_ok)
File /opt/conda/lib/python3.10/shutil.py:457, in _copytree(entries, src, dst, symlinks, ignore, copy_function, ignore_dangling_symlinks, dirs_exist_ok)
454 else:
455 ignored_names = set()
--> 457 os.makedirs(dst, exist_ok=dirs_exist_ok)
458 errors = []
459 use_srcentry = copy_function is copy2 or copy_function is copy
File /opt/conda/lib/python3.10/os.py:225, in makedirs(name, mode, exist_ok)
223 return
224 try:
--> 225 mkdir(name, mode)
226 except OSError:
227 # Cannot rely on checking for EEXIST, since the operating system
228 # could give priority to other errors like EACCES or EROFS
229 if not exist_ok or not path.isdir(name):
FileExistsError: [Errno 17] File exists: '/kaggle/working/output'
输出目录 ‘/kaggle/working/output’ 已经存在,并且你希望覆盖其中的内容,可以使用 shutil.rmtree() 函数删除现有目录,然后再执行复制操作。请注意,这将删除输出目录中的所有内容,请确保你已经备份了重要的数据。
以下是更新后的代码示例:
import os
import shutil
input_path = "/kaggle/input/regionclip-main"
output_path = "/kaggle/working/output"
# 删除现有的输出目录
if os.path.exists(output_path):
shutil.rmtree(output_path)
# 复制目录
shutil.copytree(input_path, output_path)
通过在复制之前删除现有目录,你可以避免 FileExistsError。请确保仔细评估是否需要删除现有目录,以及确认没有重要的数据将被删除。