renfeib 发表于 2022-9-20 13:54:24

sys.argv没有添加传入的参数问题

事情的背景是这样的,我写了两个py文件,其中一个是主文件,我们称它main.py,另一个为实际执行的文件,在根目录的detail文件夹下,我们称它为detail\run.py

我试图通过main.py来运行detail\run.py,其中需要从main.py传递一个参数到detail\run.py,于是我在main.py中这样写道:

argu = '我是参数'
os.system('detail\\run.py %s'%(argu))

这样,我就应该把 argu = '我是参数' 传入到detail\run.py了,也就是在detail\run.py中print(sys.argv)应该能读取到这个传进来的参数。但是现在这样的操作在我自己的两台电脑上都可以正常运行,而在我朋友的电脑上却报错out of range,也就是说这个参数并没有被传进来,sys.argv这个列表只有一个元素即文件路径本身,请问是不是我朋友电脑是不是哪里的配置不对?

我们用的这三台电脑都是python 3.10.5,电脑系统都是Windows 10 x64,所有代码在三台电脑间都都是直接发送没有作任何修改的,当然在所有py文件中都已经导入了os和sys模块

suchocolate 发表于 2022-9-20 17:08:59

为啥不以import包的形式调用里面的函数呢?

hrpzcf 发表于 2022-9-20 17:26:36

你朋友不会是直接运行 run.py 了吧?

fcage 发表于 2022-9-20 23:30:05

run.py里面的内容对吗,会不会是其他地方的列表out of range了,而print(sys.argv)是正常的?
本身感觉这代码也没问题啊

renfeib 发表于 2022-9-23 11:20:59

suchocolate 发表于 2022-9-20 17:08
为啥不以import包的形式调用里面的函数呢?

因为是由主文件main.py获得参数后,传递给子文件detail\run.py,不是一个固定的值……

renfeib 发表于 2022-9-23 11:21:48

hrpzcf 发表于 2022-9-20 17:26
你朋友不会是直接运行 run.py 了吧?

不是,运行的main.py

renfeib 发表于 2022-9-23 11:29:02

fcage 发表于 2022-9-20 23:30
run.py里面的内容对吗,会不会是其他地方的列表out of range了,而print(sys.argv)是正常的?
本身感觉 ...

应该不是代码本身的问题,因为是直接打包给他的,执行的应该是完全一模一样的,他那个感觉就是像有一道防火墙挡在main.py和run.py中间防止传参一样。比如我在主文件main.py打os.system('detail\\run.py某个参数')会报错'detail\\run.py某个参数'这个字符串有问题,因为我少了个空格嘛,说明main.py是认这个'某个参数'的;但是一旦试图传参,在主文件里打os.system('detail\\run.py 某个参数'),这里加了个空格代表我要执行run.py这个文件,并且给与它这个参数,然后跑到run.py里print(sys.argv)就完全找不到这个应该被传进来的参数,他的电脑是公司给他配置的,我不知道是不是有什么手脚在里面

hrpzcf 发表于 2022-9-23 12:25:11

renfeib 发表于 2022-9-23 11:29
应该不是代码本身的问题,因为是直接打包给他的,执行的应该是完全一模一样的,他那个感觉就是像有一道防 ...

早说呀,打包和不打包区别就大了,打包后argv的值是exe 收到的参数,而不是 run.py 收到的参数。

话说回来
因为是由主文件main.py获得参数后,传递给子文件detail\run.py,不是一个固定的值……
run.py 中定义好相关函数,main.py 收到参数后直接以传参的方式调用 run.py 中的函数就行了,为什么非要 os.system 的方式调用并传参呢?

suchocolate 发表于 2022-9-23 20:45:24

本帖最后由 suchocolate 于 2022-9-23 20:47 编辑

renfeib 发表于 2022-9-23 11:20
因为是由主文件main.py获得参数后,传递给子文件detail\run.py,不是一个固定的值……

函数传参不就是接收变量吗?

renfeib 发表于 2022-9-27 10:51:32

hrpzcf 发表于 2022-9-23 12:25
早说呀,打包和不打包区别就大了,打包后argv的值是exe 收到的参数,而不是 run.py 收到的参数。

话说 ...

抱歉,我描述有误,我还没有打包成exe,我是指打成压缩包发送给他的……
run.py 中定义好相关函数,main.py 收到参数后直接以传参的方式调用 run.py 中的函数就行了
请问您提到的这个操作要怎么实现呢,因为我现在只会用os.system

阿奇_o 发表于 2022-9-27 15:11:48

本帖最后由 阿奇_o 于 2022-9-27 15:20 编辑

假设 在同一目录内 创建以下两个.py文件(模块)
# main.py
import run
import sys, os

def welcome():
    print("~~~~ 欢迎 ~~~~")

if __name__ == "__main__":
    welcome()
    name = sys.argv
    # os.system('python run.py ' + name)
    run.do(hello='你好,' + name)
   
# run.py
import sys

def do(hello='你好!', sth="接下来,我们要开工了,干活了!!!"):
    print(hello)
    print(sth)

if __name__ == "__main__":
    name = sys.argv
    do(hello='你好,' + name)


在该目录内,进入 cmd 或 Powershell 终端命令行,执行: python main.py Alice

ps: 要程序干什么事,增删改查、打印、传参等等,都可以看做是 函数/方法 可以做的事,所以这里的 命令行传参,实际上等同于 调用run.do(...)这个函数


renfeib 发表于 2022-9-28 11:47:58

阿奇_o 发表于 2022-9-27 15:11
假设 在同一目录内 创建以下两个.py文件(模块)




好,虽然还是不清楚为什么只有那位同事的电脑跑不了,但基本是可以确定是cmd的问题,我觉得可能是公司的系统有什么特别的设置。我之前是单纯做成os.system连接两个py文件,我觉得您和之前几位朋友提到的用模块和函数来做(虽然应该是主流才对)比较合适,我会朝这个方向改进
页: [1]
查看完整版本: sys.argv没有添加传入的参数问题