在目录中运行os命令

zbsbpyhn  于 2021-09-08  发布在  Java
关注(0)|答案(4)|浏览(428)

我有一个脚本,首先创建一个文件夹(以i命名,for循环中的list元素)。然后我想使用 cd 并在其中运行wget命令。
但是,目前,wget命令在根文件夹中运行并下载那里的所有文件(而不是导航到该文件夹,然后下载其中的文件)
也许我必须在文件夹创建之前设置计时器或等待?如何修复此问题并在创建的文件夹中运行wget命令?

import os
lst = ['www.sr-line.com','www.montratec.com']

for i in lst:
    print(i)
    os.system('mkdir %s' % i)
    os.system('cd %s' % i)
    #os.system('mkdir test')
    os.system('wget -A pdf -m -p -E -k -K -nd %s' % i)
    os.system('cd ..')
mbzjlibv

mbzjlibv1#

每个命令都在新的shell中执行,您需要将它们链接在一起:

import os
lst = ['www.sr-line.com', 'www.montratec.com']

for i in lst:
    command = 'mkdir -p /tmp/{i}; cd /tmp/{i}; wget -A pdf -m -p -E -k -K -nd {i}'
    os.system(command)
dfty9e19

dfty9e192#

在您的示例中,可以使用直接python操作,而不是为每个命令启动shell。这可以提供更具可读性和更快的代码。例如(有关详细信息,请参阅python标准库文档),linux上(未经测试的代码):

os.mkdir(i)
 oldwd = os.getcwd()
 os.chdir(i)
 os.system('wget -A pdf -m -p -E -k -K -nd %s' % i)
 os.chdir(oldwd)

你甚至不需要用叉子 wget 命令(该程序甚至可能未安装)。。。您可以使用os.urllib中的工具
请记住,启动一个新进程是一项成本相当高的操作(您的操作系统可能会在这方面失败:在linux上,请参阅fork(2)、syscalls(2)、errno(3)…)

wmvff8tz

wmvff8tz3#

可以在一个字符串中运行put多个命令,字符串之间用 ; .

os.system("mkdir test ; cd test ; wget ...")

如果comands需要使用参数,那么您应该只使用一个参数 % 具有所有值的列表/元组

os.system('mkdir %s ; cd %s ; wget -A pdf -m -p -E -k -K -nd %s ; cd ..' % (i, i, i) )

或者你应该使用 .format() ```
os.system('mkdir {} ; cd {} ; wget -A pdf -m -p -E -k -K -nd {} ; cd ..'.format(i, i, i))

但更简单的方法是使用 `f-string` ```
os.system(f'mkdir {i} ; cd {i} ; wget -A pdf -m -p -E -k -K -nd {i} ; cd ..')

编辑:
最终,您可以单独创建每个命令,然后将它们连接起来——使用list会更简单

all_cmds = [
   'mkdir %s' % i,
   'cd %s' % i,
   'wget -A pdf -m -p -E -k -K -nd %s' % i,
   'cd ..'
]

cmd = ';'.join(all_cmds)

如果你想使用它,它是有用的 if/else 跳过某些元素

create_subfolder = True # False

all_cmds = []

if create_subfolder:
   all_cmds.append( 'mkdir %s' % i )
   all_cmds.append( 'cd %s' % i )

all_cmds.append( 'wget -A pdf -m -p -E -k -K -nd %s' % i )

if create_subfolder:
   all_cmds.append( 'cd ..' )

cmd = ';'.join(all_cmds)

顺便说一句:
此方法对于在单个命令中添加或跳过参数也很有用

cmd = ['wget']

if some_parameter:
    #cmd.append('-A pdf')
    #cmd.extend(['-A', 'pdf']) 
    cmd += ['-A', 'pdf'] 

cmd += ['-m', '-p', '-E', '-k', '-K', '-nd', i] # directly `i` without `%s`

cmd = ' '.join(cmd)  # join with spaces
j2cgzkjk

j2cgzkjk4#

跑步 system() 将启动一个新流程。该进程所做的不会影响父进程,因此那里的目录更改不会影响其他任何进程,包括由同一父进程启动的同级进程。
告诉我 wget 在影响性能的流程中,在何处存储内容或执行目录更改 wget ,例如父母。

相关问题