python -m xxx.py

本文探讨了Python中直接运行与作为模块启动的区别,重点分析了这两种方式对sys.path的影响,并通过实例说明了在不同启动方式下如何正确处理模块导入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://www.cnblogs.com/softidea/p/5119923.html


python -m xxx.py

作用是:把xxx.py文件当做模块启动
但是我一直不明白当做模块启动到底有什么用。python xxx.py和python -m xxx.py有什么区别!

自问自答:

python xxx.py
python -m xxx.py

这是两种加载py文件的方式:
1叫做直接运行
2相当于import,叫做当做模块来启动
不同的加载py文件的方式,主要是影响——sys.path 这个属性。sys.path 就相当于liunx中的PATH。

下面来看一下sys.path

import sys
sys.path
[”, ‘/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python27.zip’,
…]

上面的内容我只截取了一段。此为当前python解释器运行的环境,python解释器会在这些目录下去寻找依赖的库!
注解一点:’ ‘为当前目录


下面有两个例子,通过不同方式启动同一文件,sys.path属性的值有何不同。

run.py 内容如下

import sys
print(sys.path)

直接启动:python run.py

test_import_project git:(master) ✗ python run.py
[‘/Users/sx/Documents/note/test_py/test_import_project’,
‘/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python27.zip’,
…]

以模块方式启动:python -m run.py

test_import_project git:(master) ✗ python -m run.py
[”,
‘/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python27.zip’,

* 细心的同学会发现,区别就是在第一行。
直接启动是把run.py文件,所在的目录放到了sys.path属性中。
模块启动是把你输入命令的目录(也就是当前路径),放到了sys.path属性中*
在工作场景中有什么用呢?

目录结构如下

package/
init.py
mod1.py
package2/
init.py
run.py

run.py 内容如下

import sys
from package import mod1
print(sys.path)

如何才能启动run.py文件?

直接启动(失败)

➜ test_import_project git:(master) ✗ python package2/run.py
Traceback (most recent call last):
File “package2/run.py”, line 2, in
from package import mod1
ImportError: No module named package

以模块方式启动(成功)

➜ test_import_project git:(master) ✗ python -m package2.run
[”,
‘/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python27.zip’,
…]

当需要启动的py文件引用了一个模块。你需要注意:在启动的时候需要考虑sys.path中有没有你import的模块的路径!
这个时候,到底是使用直接启动,还是以模块的启动?目的就是把import的那个模块的路径放到sys.path中。

要运行一个 Python 脚本并传递一个 `.tar.gz` 压缩包作为参数,可以通过命令行直接实现。Python 脚本可以接收命令行参数,并对其进行处理,例如解压、读取内容或执行特定操作。 ### 示例:接收压缩包路径作为参数 以下是一个简单的 Python 脚本示例,它接收一个 `.tar.gz` 文件路径作为参数,并尝试解压该文件: ```python # extract_tar.py import tarfile import sys def extract_tar_gz(file_path): with tarfile.open(file_path, "r:gz") as tar: tar.extractall() print(f"Extracted contents from {file_path}") if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python extract_tar.py <path_to_tar_gz_file>") sys.exit(1) tar_file = sys.argv[1] extract_tar_gz(tar_file) ``` ### 运行脚本并传递压缩包 在命令行中运行上述脚本的方式如下: ```bash python extract_tar.py example.tar.gz ``` 其中 `example.tar.gz` 是你希望传递的压缩包文件名。此命令会调用 `extract_tar.py` 并将 `example.tar.gz` 作为第一个参数传入[^1]。 ### 处理多个参数 如果需要传递多个参数,比如目标解压目录等,可以在脚本中使用 `argparse` 模块进行更复杂的参数解析: ```python # extract_with_args.py import tarfile import argparse def extract_tar_gz(file_path, target_dir=None): with tarfile.open(file_path, "r:gz") as tar: tar.extractall(path=target_dir) print(f"Extracted contents from {file_path} to {target_dir or '.'}") if __name__ == "__main__": parser = argparse.ArgumentParser(description="Extract a .tar.gz file.") parser.add_argument("tar_file", help="Path to the .tar.gz file") parser.add_argument("--output", "-o", help="Target directory to extract files") args = parser.parse_args() extract_tar_gz(args.tar_file, args.output) ``` 运行方式如下: ```bash python extract_with_args.py example.tar.gz -o output_directory ``` 这将把 `example.tar.gz` 解压到 `output_directory` 目录中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值