You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python新手提问:如何在另一模块引用命令行参数指定的文件?

如何在第二个Python脚本中引用第一个脚本创建的文件

作为新手,你遇到的这个问题其实是Python脚本间共享数据(这里是文件路径)的常见场景,我给你整理了几个最实用的方案,一步步来:


方案一:命令行手动传递(最直接、最推荐)

既然第一个脚本是通过命令行参数获取文件名的,那第二个脚本也用同样的方式让用户传入同一个文件名就好,逻辑清晰且不容易出错。

第一个脚本(script1.py)优化版

先调整下你的代码,注意用完文件对象后要关闭,或者用with语句更安全:

import argparse

def main():
    parser = argparse.ArgumentParser(description="Create files for script2 to use")
    # 如果只需要创建单个文件,可以去掉nargs='+',这样args.file_to_be_created是单个文件对象
    parser.add_argument('file_to_be_created', nargs='+', type=argparse.FileType('w'), help='Path(s) to file(s) to create')
    args = parser.parse_args()

    # 写入示例内容并关闭文件
    for file_obj in args.file_to_be_created:
        file_obj.write("This content is from script1!\n")
        file_obj.close()
        print(f"Successfully created: {file_obj.name}")

if __name__ == "__main__":
    main()

第二个脚本(script2.py)

同样用argparse解析用户传入的文件名,然后读取使用:

import argparse

def main():
    parser = argparse.ArgumentParser(description="Use files created by script1")
    parser.add_argument('file_to_use', nargs='+', type=argparse.FileType('r'), help='Path(s) to file(s) created by script1')
    args = parser.parse_args()

    # 读取并打印文件内容
    for file_obj in args.file_to_use:
        content = file_obj.read()
        print(f"\nContent from {file_obj.name}:")
        print(content)
        file_obj.close()

if __name__ == "__main__":
    main()

运行方式

在终端执行:

# 第一步:创建文件
python script1.py my_test_file.txt
# 第二步:使用文件
python script2.py my_test_file.txt

方案二:自动记录文件名到配置文件(适合不想手动输入的场景)

如果不想每次运行第二个脚本都输入文件名,可以让第一个脚本把创建的文件名写到一个固定的小配置文件里,第二个脚本读取这个配置文件获取路径。

修改script1.py

在创建完文件后,把文件名写入last_created_files.txt:

# (前面的代码不变)
    for file_obj in args.file_to_be_created:
        file_obj.write("This content is from script1!\n")
        file_obj.close()
        print(f"Successfully created: {file_obj.name}")

    # 记录文件名到配置文件
    with open("last_created_files.txt", "w") as config_file:
        for file_obj in args.file_to_be_created:
            config_file.write(f"{file_obj.name}\n")

编写script2.py

读取配置文件里的文件名,直接使用:

def main():
    # 读取配置文件中的文件名
    try:
        with open("last_created_files.txt", "r") as config_file:
            filenames = [line.strip() for line in config_file if line.strip()]
    except FileNotFoundError:
        print("Error: No created files found! Run script1 first.")
        return

    # 读取每个文件的内容
    for filename in filenames:
        try:
            with open(filename, "r") as f:
                content = f.read()
                print(f"\nContent from {filename}:")
                print(content)
        except FileNotFoundError:
            print(f"Warning: File {filename} no longer exists!")

if __name__ == "__main__":
    main()

方案三:包内函数调用(适合作为Python包内部调用的场景)

如果你的两个脚本是作为一个包的一部分,不是单独运行,而是被其他代码调用,可以把逻辑封装成函数,通过返回值传递文件名。

包结构示例

my_package/
    __init__.py
    script1.py
    script2.py

script1.py(封装成函数)

def create_files(filenames):
    created_files = []
    for filename in filenames:
        with open(filename, "w") as f:
            f.write("This content is from script1!\n")
            created_files.append(filename)
            print(f"Successfully created: {filename}")
    return created_files

# 保留命令行运行的入口
if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('file_to_be_created', nargs='+', help='Path(s) to file(s) to create')
    args = parser.parse_args()
    create_files(args.file_to_be_created)

script2.py(导入函数并使用)

from .script1 import create_files

def use_files(filenames):
    for filename in filenames:
        with open(filename, "r") as f:
            content = f.read()
            print(f"\nContent from {filename}:")
            print(content)

# 调用示例
if __name__ == "__main__":
    # 可以直接指定文件名,或者从命令行获取
    target_files = ["my_test_file.txt"]
    create_files(target_files)
    use_files(target_files)

小提醒

  • 如果你只需要处理单个文件,建议去掉nargs='+',这样args.file_to_be_created会是单个文件对象,不用遍历列表,代码更简洁。
  • 使用argparse.FileType时,文件会被自动打开,记得用完关闭,或者用with语句管理文件上下文(更推荐)。

内容的提问来源于stack exchange,提问作者jing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:33:24