自我复制文件,检索已执行脚本的名称

时间:2016-08-02 15:59:18

标签: python python-3.x python-3.5

有没有办法将os.path.basename(__file__)更改为当前正在运行的脚本中执行的文件的名称?

我创建了一个简单的自我复制文件。它首先访问根目录。然后,它会对所有可写的子目录进行排序,并从列表中选择一个随机的子目录。之后,它会写一个随机字符串作为名称的.py文件。然后使用os.path.basename(__file__)检索文件名并将行复制到新写入的文件中。完成所有操作后,它会执行新创建的文件,该文件会再次重复该过程。但是,在第二轮中,它会保留__file__作为原始文件名,而不是新生成的文件。

此部分存储原始目录路径和文件名

import os
import random

orig_dir = os.getcwd()
orig_file = os.path.basename(__file__)

这部分是文件编写过程和新文件的执行。 注意:路径变量是根目录中随机选取的子目录,其中包含新写入的文件。

file_create = open(rand_name, "w")
file_create.close()
file_create = open(rand_name, "a")
os.chdir(orig_dir)
copy_file = open(orig_file, "r")
for line in copy_file.readlines():
    file_create.write(line)

file_create.close()
copy_file.close()
os.chdir(path)

exec(open(rand_name).read())

更新 我在下面发布了整个脚本。我也有一些粗暴和丑陋的方法让它发挥作用,但我更专注于手头的问题。

import os
import random

orig_dir = os.getcwd()
orig_file = os.path.basename(__file__)

for loop in range(20):
    os.chdir("..")
root = os.getcwd()

direct = []
for items in os.listdir():
    if os.path.isdir(items) and os.access(items, os.W_OK) and os.access(items, os.R_OK):
        direct.append(items)

path = os.path.join(os.getcwd(), random.choice(direct))
rand_name = str(random.randint(1, 10000000000)) + ".py"
os.chdir(path)
print(path)

# prevents the creation of a duplicate file name in the same location.
# If it is, loops the name generator until a valid name is generated
while True:
    if os.path.isfile(rand_name):
        rand_name = str(random.randint(1, 10000000000)) + ".py"
    else:
        break


file_create = open(rand_name, "w")
file_create.close()
file_create = open(rand_name, "a")
os.chdir(orig_dir)
copy_file = open(orig_file, "r")
for line in copy_file.readlines():
    file_create.write(line)


file_create.close()
copy_file.close()
os.chdir(path)
os.execl(rand_name, ''), 

os.exec(path, '')是我尝试的最后一个解决方案,但它开始返回PermissionError: [Errno 13] Permission denied。我尝试使用sudo权限运行它,并返回相同的权限错误。

0 个答案:

没有答案